diff --git a/ArgsParser/ArgsParser.vcxproj b/ArgsParser/ArgsParser.vcxproj index f5fb3e8..54aa7f4 100644 --- a/ArgsParser/ArgsParser.vcxproj +++ b/ArgsParser/ArgsParser.vcxproj @@ -36,12 +36,12 @@ - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core debug - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core release diff --git a/CoreTest/CoreTest.vcxproj b/CoreTest/CoreTest.vcxproj index 934b4b9..6a9f177 100644 --- a/CoreTest/CoreTest.vcxproj +++ b/CoreTest/CoreTest.vcxproj @@ -36,12 +36,12 @@ - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core debug - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core release diff --git a/WsNovelParser/WsNovelParser.vcxproj b/WsNovelParser/WsNovelParser.vcxproj index ea2c127..3101f7b 100644 --- a/WsNovelParser/WsNovelParser.vcxproj +++ b/WsNovelParser/WsNovelParser.vcxproj @@ -37,12 +37,12 @@ - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core;xml;gui;widgets debug - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core;xml release diff --git a/WsNovelParser/novelparser.cpp b/WsNovelParser/novelparser.cpp index 2e2e801..d528a24 100644 --- a/WsNovelParser/novelparser.cpp +++ b/WsNovelParser/novelparser.cpp @@ -13,6 +13,7 @@ NovelParser::NovelParser() { checker_list << std::make_shared(); checker_list << std::make_shared(); checker_list << std::make_shared(); + checker_list << std::make_shared(); analyzer_ref = std::make_shared(checker_list); } diff --git a/libParse/libParse.vcxproj b/libParse/libParse.vcxproj index e760aea..ceefe62 100644 --- a/libParse/libParse.vcxproj +++ b/libParse/libParse.vcxproj @@ -37,12 +37,12 @@ - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core;xml;gui;widgets debug - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core release diff --git a/libParse/parse_novel.cpp b/libParse/parse_novel.cpp index 398fa59..1f94721 100644 --- a/libParse/parse_novel.cpp +++ b/libParse/parse_novel.cpp @@ -54,7 +54,8 @@ void FragmentExistsCheck::exists_check(std::shared_ptr root, std: } FragmentExistsCheck::FragmentExistsCheck() - :_nodes_cache(std::make_shared()) { } + :_nodes_cache(std::make_shared()) { +} void FragmentExistsCheck::validCheck(std::shared_ptr root) const { const_cast(this)->nodes_regist(this->_nodes_cache, root); @@ -277,7 +278,8 @@ QString PointGraphCheck::name() const { return "情节网络引用检查器"; } -PointGraphHelper::PointGraphHelper(std::shared_ptr node) : node_peer(node) { } +PointGraphHelper::PointGraphHelper(std::shared_ptr node) : node_peer(node) { +} std::shared_ptr PointGraphHelper::nodePeer() const { return this->node_peer; @@ -409,9 +411,9 @@ std::shared_ptr FragmentLayerCheck::_sets_fill(std::shared_ptr node) { - auto fragm = std::static_pointer_cast(node->bind()->element()); + auto fragm = std::static_pointer_cast(node->bind()->element()); for (auto node_t : fragm->children()) { - auto refn = std::static_pointer_cast(node_t); + auto refn = std::static_pointer_cast(node_t); auto target_node = _node_set[refn->referSignature()]; std::const_pointer_cast(node)->appendNext(target_node); } @@ -427,6 +429,62 @@ void FragmentLayerCheck::node_relayer(std::shared_ptr node, int cu } } + +/// +/// 层级确认 +/// +/// 故事线 +void FragmentLayerCheck::layer_check(std::shared_ptr node) { + switch ((NovelNode) node->element()->typeMark()) { + case NovelNode::StoryDefine: + story_layer_check(node); + break; + default: + layer_check(node); + 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) { + auto prev = curr - 1; + auto curr_sign = (*curr)->element()->signature(); + auto prev_sign = (*prev)->element()->signature(); + + sibling_element_compair(_node_set[prev_sign], _node_set[curr_sign]); + } +} + +void FragmentLayerCheck::sibling_element_compair(std::shared_ptr prev, std::shared_ptr curr) { + auto prev_childs = prev->referNodes(); + auto curr_childs = curr->referNodes(); + + QList prev_layers; + std::transform(prev_childs.begin(), prev_childs.end(), std::back_inserter(prev_layers), + [](std::shared_ptr ins) { return ins->layerNumber(); }); + + QList next_layers; + std::transform(curr_childs.begin(), curr_childs.end(), std::back_inserter(next_layers), + [](std::shared_ptr ins) { return ins->layerNumber(); }); + + auto min0 = *std::min_element(prev_layers.begin(), prev_layers.end()); + auto max1 = *std::max_element(next_layers.begin(), next_layers.end()); + + if (min0 < 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; }); + QStringList names; + std::transform(tempx.begin(), tempx.end(), std::back_inserter(names), + [=](std::shared_ptr ins) { return ins->bind()->element()->signature(); }); + + throw new CheckException(QString("CheckError[0x0009]情节时间序错误!%1->%2\n\t\t%3->{%4}") + .arg(prev->bind()->element()->signature()).arg(curr->bind()->element()->signature()) + .arg(curr->bind()->element()->signature(), names.join(","))); + } +} + QString FragmentLayerCheck::name() const { return "情节时间层级校验器"; } @@ -437,14 +495,15 @@ void FragmentLayerCheck::validCheck(std::shared_ptr_node_set) chk->_refers_rebuild(node); - for (auto node : chk->_story_start) chk->node_relayer(node); + chk->layer_check(root); } -FragmentNode::FragmentNode(std::shared_ptr bind) :_src_fragm(bind) { } +FragmentNode::FragmentNode(std::shared_ptr bind) :_src_fragm(bind) { +} -std::shared_ptr FragmentNode::bind() const { +std::shared_ptr FragmentNode::bind() const { return this->_src_fragm; } @@ -452,14 +511,6 @@ void FragmentNode::setLayer(int number) { this->_layer_number = number; } -void FragmentNode::setLayer(int number) { - this->_layer_number = number; -} - -int FragmentNode::layerNumber() const { - return this->_layer_number; -} - int FragmentNode::layerNumber() const { return this->_layer_number; } diff --git a/libParse/parse_novel.h b/libParse/parse_novel.h index cb18fb3..2bf38cb 100644 --- a/libParse/parse_novel.h +++ b/libParse/parse_novel.h @@ -111,13 +111,13 @@ namespace example_novel { class FragmentNode : public std::enable_shared_from_this { private: - std::shared_ptr _src_fragm = nullptr; + std::shared_ptr _src_fragm = nullptr; QList> _next_fragms; int _layer_number = -1; public: - FragmentNode(std::shared_ptr bind); - std::shared_ptr bind() const; + FragmentNode(std::shared_ptr bind); + std::shared_ptr bind() const; void setLayer(int number); int layerNumber() const; @@ -138,17 +138,25 @@ namespace example_novel { * @brief 故事线转换 */ std::shared_ptr _sets_fill(std::shared_ptr node); - /** - * @brief 引用网络重构 - */ + /// + /// 引用网络重构 + /// + /// 传入情节定义结点 void _refers_rebuild(std::shared_ptr node); - /** - * @brief 节点层级重排 - */ + /// + /// 节点层级重排 + /// + /// 目标结点 + /// 目标层级 void node_relayer(std::shared_ptr node, int curr = 0); - - void layer_check(std::shared_ptr node){ } + /// + /// 层级确认 + /// + /// 故事线 + void layer_check(std::shared_ptr node); + void story_layer_check(std::shared_ptr story); + void sibling_element_compair(std::shared_ptr prev, std::shared_ptr curr); public: // 通过 CheckProvider 继承 diff --git a/libSyntax/libSyntax.vcxproj b/libSyntax/libSyntax.vcxproj index 6da7ffe..399602f 100644 --- a/libSyntax/libSyntax.vcxproj +++ b/libSyntax/libSyntax.vcxproj @@ -38,12 +38,12 @@ - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core;xml;gui;widgets debug - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core release diff --git a/libWords/libWords.vcxproj b/libWords/libWords.vcxproj index 532b8c9..083b5f0 100644 --- a/libWords/libWords.vcxproj +++ b/libWords/libWords.vcxproj @@ -36,12 +36,12 @@ - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core release - 5.12.11_msvc2017_64 + 5.12.9_msvc2017_64 core debug