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