diff --git a/ArgsParser/ArgsParser.vcxproj b/ArgsParser/ArgsParser.vcxproj index 4fe94b0..e64e55f 100644 --- a/ArgsParser/ArgsParser.vcxproj +++ b/ArgsParser/ArgsParser.vcxproj @@ -63,6 +63,12 @@ + + + stdcpp20 + /utf-8 %(AdditionalOptions) + + true diff --git a/ArgsParser/argsparser.cpp b/ArgsParser/argsparser.cpp index 905a4ad..e1dd2e5 100644 --- a/ArgsParser/argsparser.cpp +++ b/ArgsParser/argsparser.cpp @@ -6,7 +6,7 @@ using namespace std; __ArgvPackImpls::__ArgvPackImpls(const QString& means, ParamType t) : means_store(means), type_store(t) { } -// 通过 IArgvPack 继承 +// 閫氳繃 IArgvPack 缁ф壙 ParamType __ArgvPackImpls::paramType() const { return type_store; } @@ -49,7 +49,7 @@ bool FloatKeyValue::parse(const QList args) { return false; auto args_t = args[0]; - if (args_t == u8"--" + bindKey()) { + if (args_t == "--" + bindKey()) { auto args_v = args[1]; setValue(args_v); return true; @@ -97,7 +97,7 @@ bool FloatOption::parse(const QList args) { return false; auto args_t = args[0]; - if (args_t == u8"--" + bindKey()) { + if (args_t == "--" + bindKey()) { setValue(true); return true; } @@ -108,8 +108,8 @@ MatchMode::MatchMode(int mode_code, const QString& mode) :_means_explain(mode), code_store(mode_code) { } /** -* @brief 获取模式代码 -* @return 模式代码 +* @brief 鑾峰彇妯″紡浠g爜 +* @return 妯″紡浠g爜 */ MatchMode& MatchMode::operator<<(std::shared_ptr unit) { @@ -119,7 +119,7 @@ MatchMode& MatchMode::operator<<(std::shared_ptr unit) { if (u_exist->paramType() == ParamType::FloatParam) { auto u_cast = std::dynamic_pointer_cast<__FloatArgvImpls>(u_exist); if (u_cast->bindKey() == unit_in->bindKey()) - throw new std::exception("重复设置选项"); + throw new std::exception("閲嶅璁剧疆閫夐」"); } } } @@ -135,14 +135,14 @@ int MatchMode::modeCode() const { QString MatchMode::usageString() const { QString usage_string; for (auto& item : args_mode) - usage_string += item->placeHolder() + u8" "; + usage_string += item->placeHolder() + " "; return usage_string; } QString MatchMode::explanString() const { QStringList sections; - sections << u8" " + _means_explain; + sections << " " + _means_explain; sections << QString(" Switch:"); for (auto& item : args_mode) { @@ -163,7 +163,7 @@ QString MatchMode::explanString() const { } /** -* @brief 解析匹配参数 +* @brief 瑙f瀽鍖归厤鍙傛暟 */ bool MatchMode::parse(const QList& args) { @@ -247,14 +247,14 @@ ArgsParser& ArgsParser::operator<<(std::shared_ptr mode) { } std::shared_ptr ArgsParser::parse(int argc, char* argv[]) { - // 聚合参数数组 + // 鑱氬悎鍙傛暟鏁扮粍 QList args_list; for (int idx = 0; idx < argc; idx++) { auto argv_str = QString::fromLocal8Bit(argv[idx]); args_list.append(argv_str); } - // 枚举模式匹配 + // 鏋氫妇妯″紡鍖归厤 for (auto& minst : this->match_modes) { if (minst->parse(args_list)) return minst; diff --git a/ArgsParser/argsparser.h b/ArgsParser/argsparser.h index ecfa440..de9ced6 100644 --- a/ArgsParser/argsparser.h +++ b/ArgsParser/argsparser.h @@ -10,7 +10,7 @@ namespace args_parse { /** - * 参数类型. + * 鍙傛暟绫诲瀷. */ enum class ParamType { IndexParam, @@ -18,37 +18,37 @@ namespace args_parse { }; /** - * @brief 命令行参数包. + * @brief 鍛戒护琛屽弬鏁板寘. */ class IArgvPack { public: virtual ~IArgvPack() = default; /** - * 参数包类型. + * 鍙傛暟鍖呯被鍨. * * \return */ virtual ParamType paramType() const = 0; /** - * @brief 参数解释. + * @brief 鍙傛暟瑙i噴. * - * \return 解释 + * \return 瑙i噴 */ virtual QString means() const = 0; virtual QString placeHolder(bool decorate = true) const = 0; virtual QVariant value() const = 0; /** - * @brief 匹配长度. + * @brief 鍖归厤闀垮害. * - * \return 长度 + * \return 闀垮害 */ virtual int matchLenth() const = 0; /** - * @brief 解析. + * @brief 瑙f瀽. * - * \param argv 输入 - * \param start 起始解析 - * \return 匹配成功 + * \param argv 杈撳叆 + * \param start 璧峰瑙f瀽 + * \return 鍖归厤鎴愬姛 */ virtual bool parse(const QList args) = 0; }; @@ -64,7 +64,7 @@ namespace args_parse { void setValue(const QVariant &v); - // 通过 IArgvPack 继承 + // 閫氳繃 IArgvPack 缁ф壙 ParamType paramType() const override; QString means() const override; QVariant value() const override; @@ -83,17 +83,17 @@ namespace args_parse { }; /** - * @brief 命令行key-value解析匹配模式. + * @brief 鍛戒护琛宬ey-value瑙f瀽鍖归厤妯″紡. * --key value */ class ARGSPARSER_EXPORT FloatKeyValue : public __FloatArgvImpls { public: /** - * 浮动key-value解析单元. + * 娴姩key-value瑙f瀽鍗曞厓. * - * \param key 键名 - * \param means 参数解释 - * \param optional 是否可选 + * \param key 閿悕 + * \param means 鍙傛暟瑙i噴 + * \param optional 鏄惁鍙 */ explicit FloatKeyValue(const QString& key, const QString &means, bool optional = false); virtual ~FloatKeyValue() = default; @@ -104,17 +104,17 @@ namespace args_parse { }; /** - * @brief 命令行key解析匹配模式. + * @brief 鍛戒护琛宬ey瑙f瀽鍖归厤妯″紡. * --key */ class ARGSPARSER_EXPORT FloatOption : public __FloatArgvImpls { public: /** - * 浮动option解析单元. + * 娴姩option瑙f瀽鍗曞厓. * - * \param key 键名 - * \param means 参数解释 - * \param optional 是否可选 + * \param key 閿悕 + * \param means 鍙傛暟瑙i噴 + * \param optional 鏄惁鍙 */ explicit FloatOption(const QString& key, const QString& means, bool optional = false); virtual ~FloatOption() = default; @@ -125,7 +125,7 @@ namespace args_parse { }; /** - * 序列索引参数. + * 搴忓垪绱㈠紩鍙傛暟. */ class ARGSPARSER_EXPORT IndexParam : public __ArgvPackImpls { private: @@ -135,7 +135,7 @@ namespace args_parse { explicit IndexParam(const QString & place_v, const QString &means); virtual ~IndexParam() = default; - // 通过 __ArgvPackImpls 继承 + // 閫氳繃 __ArgvPackImpls 缁ф壙 virtual QString placeHolder(bool decorate = true) const override; int matchLenth() const override; bool parse(const QList args) override; @@ -152,27 +152,27 @@ namespace args_parse { explicit MatchMode(int mode_code, const QString &explain); /** - * @brief 获取模式代码 - * @return 模式代码 + * @brief 鑾峰彇妯″紡浠g爜 + * @return 妯″紡浠g爜 */ int modeCode()const; /** - * 获取用例字符串. + * 鑾峰彇鐢ㄤ緥瀛楃涓. * * \return */ QString usageString() const; /** - * 返回模式解析字符串. + * 杩斿洖妯″紡瑙f瀽瀛楃涓. * * \return */ QString explanString() const; /** - * 添加参数解析单元. + * 娣诲姞鍙傛暟瑙f瀽鍗曞厓. * * \param unit * \return @@ -180,12 +180,12 @@ namespace args_parse { MatchMode& operator<<(std::shared_ptr unit); /** - * @brief 解析匹配参数 + * @brief 瑙f瀽鍖归厤鍙傛暟 */ bool parse(const QList& args); /** - * 获取解析单元. + * 鑾峰彇瑙f瀽鍗曞厓. * * \param key * \return diff --git a/CoreTest/main.cpp b/CoreTest/main.cpp index c4f00c4..b2f225e 100644 --- a/CoreTest/main.cpp +++ b/CoreTest/main.cpp @@ -10,11 +10,13 @@ int main(int argc, char* argv[]) { QCoreApplication a(argc, argv); - QFile in("D:\\Projects\\Cpp\\WsNovelParser\\CoreTest\\syntax_example.txt"); + + QFile in("D:\\Projects\\Cpp\\WsNovelParser\\x64\\test_file\\description - 鍓湰.story"); in.open(QIODevice::ReadOnly | QIODevice::Text); QTextStream tt(&in); + tt.setCodec("UTF-8"); lib_words::WordReader reader; - auto vwords = reader.wordsFrom(tt, "D:\\Projects\\Cpp\\WsNovelParser\\CoreTest\\syntax_example.txt"); + auto vwords = reader.wordsFrom(tt, "D:\\Projects\\Cpp\\WsNovelParser\\x64\\test_file\\description - 鍓湰.story"); ast_gen::SyntaxParser parser(example_novel::NovalSyntax::getSyntaxTree()); auto rst = parser.parse(vwords); diff --git a/CoreTest/syntax_example.txt b/CoreTest/syntax_example.txt index fc7c32f..4317d10 100644 --- a/CoreTest/syntax_example.txt +++ b/CoreTest/syntax_example.txt @@ -14,24 +14,24 @@ 故事介绍段落 aldkfjl flwief } -{故事 故事名称4 +{故事 故事名称5 故事介绍段落 aldkfjl flwief {剧情 剧情名称} } -{故事 故事名称4 +{故事 故事名称6 故事介绍段落 aldkfjl flwief {剧情 剧情名称 剧情介绍} } -{故事 故事名称4 +{故事 故事名称7 故事介绍段落 aldkfjl flwief {剧情 剧情名称 剧情介绍 } } -{故事 故事名称4 +{故事 故事名称8 故事介绍段落 aldkfjl flwief {剧情 剧情名称 剧情介绍 @@ -39,7 +39,7 @@ } } -{故事 故事名称4 +{故事 故事名称9 故事介绍段落 aldkfjl flwief {剧情 剧情名称 剧情介绍 @@ -48,7 +48,7 @@ } } -{故事 故事名称4 +{故事 故事名称10 故事介绍段落 aldkfjl flwief {剧情 剧情名称 剧情介绍 @@ -58,6 +58,17 @@ } } +{故事 故事名称11 + 故事介绍段落 aldkfjl flwief + {剧情 剧情名称 + 剧情介绍 + {节点 节点名称 + 奥龙订饭;爱领克 非两爱看扥 + } + {@节点 故事名称10&剧情名称&节点名称} + } +} + {故事 故事名称4 故事介绍段落 aldkfjl flwief {剧情 剧情名称 @@ -65,18 +76,7 @@ {节点 节点名称 奥龙订饭;爱领克 非两爱看扥 } - {@节点 节点面&发来垦局&零件扥} - } -} - -{故事 故事名称4 - 故事介绍段落 aldkfjl flwief - {剧情 剧情名称 - 剧情介绍 - {节点 节点名称 - 奥龙订饭;爱领克 非两爱看扥 - } - {@节点 节点面&发来垦局&零件扥 + {@节点 故事名称10&剧情名称&节点名称 asldkfj 来看房莱肯} } } @@ -88,7 +88,7 @@ {节点 节点名称 奥龙订饭;爱领克 非两爱看扥 } - {@节点 节点面&发来垦局&零件扥 + {@节点 故事名称10&剧情名称&节点名称 asldkfj 来看房莱肯 } } @@ -116,14 +116,14 @@ {分卷 卷宗名称 拉开茯苓领赛季发啦肯 lakdjf;alfj {章节 章节名称 昂来看申领发 - {@节点 故事&剧情&节点} + {@节点 故事名称10&剧情名称&节点名称} } } {分卷 卷宗名称 拉开茯苓领赛季发啦肯 lakdjf;alfj {章节 章节名称 昂来看申领发 - {@节点 故事&剧情&节点 爱;莱肯爱;冷 + {@节点 故事名称10&剧情名称&节点名称 森铃但凡拉动垦局} } } \ No newline at end of file diff --git a/WsNovelParser.sln b/WsNovelParser.sln index a061804..7cafe39 100644 --- a/WsNovelParser.sln +++ b/WsNovelParser.sln @@ -6,6 +6,7 @@ MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WsNovelParser", "WsNovelParser\WsNovelParser.vcxproj", "{1EF577E8-D92D-4926-9207-1567137BB672}" ProjectSection(ProjectDependencies) = postProject {1FF80476-26C9-42FB-BFF6-D587C4941964} = {1FF80476-26C9-42FB-BFF6-D587C4941964} + {386F6D42-C6EB-4973-9511-181472391B21} = {386F6D42-C6EB-4973-9511-181472391B21} {C3AADEB5-3695-4DF4-B8E1-D37F928F3B2F} = {C3AADEB5-3695-4DF4-B8E1-D37F928F3B2F} {EF557F71-99AA-4F2B-A5F5-1A4518A11C19} = {EF557F71-99AA-4F2B-A5F5-1A4518A11C19} EndProjectSection @@ -17,6 +18,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libSyntax", "libSyntax\libS EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libParse", "libParse\libParse.vcxproj", "{C3AADEB5-3695-4DF4-B8E1-D37F928F3B2F}" ProjectSection(ProjectDependencies) = postProject + {386F6D42-C6EB-4973-9511-181472391B21} = {386F6D42-C6EB-4973-9511-181472391B21} {EF557F71-99AA-4F2B-A5F5-1A4518A11C19} = {EF557F71-99AA-4F2B-A5F5-1A4518A11C19} EndProjectSection EndProject @@ -28,13 +30,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "瑙e喅鏂规椤", "瑙e喅 EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ArgsParser", "ArgsParser\ArgsParser.vcxproj", "{1FF80476-26C9-42FB-BFF6-D587C4941964}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StoryPresent", "StoryPresent\StoryPresent.vcxproj", "{48DA8516-26EA-4D59-8913-7EF28E3F87C3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WsNovelManager", "WsNovelManager\WsNovelManager.vcxproj", "{DD802A96-BBB6-47CD-9B64-3582FD1805F3}" - ProjectSection(ProjectDependencies) = postProject - {1FF80476-26C9-42FB-BFF6-D587C4941964} = {1FF80476-26C9-42FB-BFF6-D587C4941964} - EndProjectSection -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libWords", "libWords\libWords.vcxproj", "{386F6D42-C6EB-4973-9511-181472391B21}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CoreTest", "CoreTest\CoreTest.vcxproj", "{9B3EEB2A-26D7-4B2C-B890-505715283400}" @@ -83,22 +78,6 @@ Global {1FF80476-26C9-42FB-BFF6-D587C4941964}.Release|x64.Build.0 = Release|x64 {1FF80476-26C9-42FB-BFF6-D587C4941964}.Release|x86.ActiveCfg = Release|x64 {1FF80476-26C9-42FB-BFF6-D587C4941964}.Release|x86.Build.0 = Release|x64 - {48DA8516-26EA-4D59-8913-7EF28E3F87C3}.Debug|x64.ActiveCfg = Debug|x64 - {48DA8516-26EA-4D59-8913-7EF28E3F87C3}.Debug|x64.Build.0 = Debug|x64 - {48DA8516-26EA-4D59-8913-7EF28E3F87C3}.Debug|x86.ActiveCfg = Debug|x64 - {48DA8516-26EA-4D59-8913-7EF28E3F87C3}.Debug|x86.Build.0 = Debug|x64 - {48DA8516-26EA-4D59-8913-7EF28E3F87C3}.Release|x64.ActiveCfg = Release|x64 - {48DA8516-26EA-4D59-8913-7EF28E3F87C3}.Release|x64.Build.0 = Release|x64 - {48DA8516-26EA-4D59-8913-7EF28E3F87C3}.Release|x86.ActiveCfg = Release|x64 - {48DA8516-26EA-4D59-8913-7EF28E3F87C3}.Release|x86.Build.0 = Release|x64 - {DD802A96-BBB6-47CD-9B64-3582FD1805F3}.Debug|x64.ActiveCfg = Debug|x64 - {DD802A96-BBB6-47CD-9B64-3582FD1805F3}.Debug|x64.Build.0 = Debug|x64 - {DD802A96-BBB6-47CD-9B64-3582FD1805F3}.Debug|x86.ActiveCfg = Debug|x64 - {DD802A96-BBB6-47CD-9B64-3582FD1805F3}.Debug|x86.Build.0 = Debug|x64 - {DD802A96-BBB6-47CD-9B64-3582FD1805F3}.Release|x64.ActiveCfg = Release|x64 - {DD802A96-BBB6-47CD-9B64-3582FD1805F3}.Release|x64.Build.0 = Release|x64 - {DD802A96-BBB6-47CD-9B64-3582FD1805F3}.Release|x86.ActiveCfg = Release|x64 - {DD802A96-BBB6-47CD-9B64-3582FD1805F3}.Release|x86.Build.0 = Release|x64 {386F6D42-C6EB-4973-9511-181472391B21}.Debug|x64.ActiveCfg = Debug|x64 {386F6D42-C6EB-4973-9511-181472391B21}.Debug|x64.Build.0 = Debug|x64 {386F6D42-C6EB-4973-9511-181472391B21}.Debug|x86.ActiveCfg = Debug|x64 diff --git a/WsNovelParser/WsNovelParser.vcxproj b/WsNovelParser/WsNovelParser.vcxproj index 9c89375..00c48be 100644 --- a/WsNovelParser/WsNovelParser.vcxproj +++ b/WsNovelParser/WsNovelParser.vcxproj @@ -61,7 +61,7 @@ - $(SolutionDir)libToken;$(SolutionDir)libSyntax;$(SolutionDir)ArgsParser;$(SolutionDir)libParse;$(IncludePath) + $(SolutionDir)libWords;$(SolutionDir)libSyntax;$(SolutionDir)ArgsParser;$(SolutionDir)libParse;$(IncludePath) $(SolutionDir)$(Platform)\$(Configuration)\;$(LibraryPath) nsc @@ -72,10 +72,11 @@ - libToken.lib;libSyntax.lib;libParse.lib;ArgsParser.lib;%(AdditionalDependencies) + libWords.lib;libSyntax.lib;libParse.lib;ArgsParser.lib;%(AdditionalDependencies) - Default + stdcpp20 + /utf-8 %(AdditionalOptions) diff --git a/WsNovelParser/WsNovelParser.vcxproj.user b/WsNovelParser/WsNovelParser.vcxproj.user index e15f6ea..0de2f02 100644 --- a/WsNovelParser/WsNovelParser.vcxproj.user +++ b/WsNovelParser/WsNovelParser.vcxproj.user @@ -3,7 +3,7 @@ $(SolutionDir)$(Platform)\$(Configuration)\ WindowsLocalDebugger - --path "D:\CustomNovels\绉戝+淇粰+鍒涢犱笘鐣" --dest E:\ + --path "D:\Projects\Cpp\WsNovelParser\x64\test_file" --dest E:\ --path "D:\CustomNovels\绉戝+淇粰+鍒涢犱笘鐣" --dest E:\ diff --git a/WsNovelParser/htmlprint.cpp b/WsNovelParser/htmlprint.cpp index 0e96227..2450ccf 100644 --- a/WsNovelParser/htmlprint.cpp +++ b/WsNovelParser/htmlprint.cpp @@ -7,15 +7,23 @@ using namespace printer; using namespace lib_parse; Access::Access(std::shared_ptr handle) - :access_handle(handle) {} + :access_handle(handle) { +} -std::shared_ptr Access::accessPeers() const { return access_handle; } +std::shared_ptr Access::accessPeers() const { + return access_handle; +} -void Access::setPageRefers(const QString& href) { this->summary_refer_store = href; } +void Access::setPageRefers(const QString& href) { + this->summary_refer_store = href; +} -QString Access::pageRefers() const { return this->summary_refer_store; } +QString Access::pageRefers() const { + return this->summary_refer_store; +} -Element::Element(std::shared_ptr handle) :Access(handle) {} +Element::Element(std::shared_ptr handle) :Access(handle) { +} void printer::Element::setSliceRefer(const QString& href) { this->refer_store = href; @@ -25,20 +33,18 @@ QString printer::Element::sliceRefers() const { return refer_store; } -Group::Group(std::shared_ptr handle) : Access(handle) {} +Group::Group(std::shared_ptr handle) : Access(handle) { +} -void Group::append(std::shared_ptr elm) -{ +void Group::append(std::shared_ptr elm) { element_store.append(elm); } -QList> Group::elements() const -{ +QList> Group::elements() const { return this->element_store; } -std::shared_ptr printer::Group::getElement(const QString& signature) const -{ +std::shared_ptr printer::Group::getElement(const QString& signature) const { for (auto& it : elements()) { if (it->accessPeers()->element()->signature() == signature) return it; @@ -46,7 +52,8 @@ std::shared_ptr printer::Group::getElement(const QString& signature) co return nullptr; } -StoryLine::StoryLine(std::shared_ptr handle) :Group(handle) {} +StoryLine::StoryLine(std::shared_ptr handle) :Group(handle) { +} void StoryLine::buildPageHTML(QDomElement& parent) const { auto syntax_access = this->accessPeers(); @@ -61,25 +68,28 @@ void StoryLine::buildPageHTML(QDomElement& parent) const { dom_storyline.appendChild(dom_title); for (auto& inst_c : syntax_access->children()) { - switch ((NovelNode)inst_c->element()->typeMark()) { - case NovelNode::TextSection: { - auto text_inst = std::dynamic_pointer_cast(inst_c->element()); - auto dom_p = doc.createElement("p"); - dom_p.appendChild(doc.createTextNode(text_inst->content())); - dom_storyline.appendChild(dom_p); - }break; - case NovelNode::PointRefers: - case NovelNode::PointDefines: { - auto element_inst = this->getElement(inst_c->element()->signature()); - element_inst->buildSliceHTML(dom_storyline); - }break; - default: - break; + switch ((NovelNode) inst_c->element()->typeMark()) { + case NovelNode::TextSection: + { + auto text_inst = std::dynamic_pointer_cast(inst_c->element()); + auto dom_p = doc.createElement("p"); + dom_p.appendChild(doc.createTextNode(text_inst->content())); + dom_storyline.appendChild(dom_p); + }break; + case NovelNode::PointRefers: + case NovelNode::PointDefines: + { + auto element_inst = this->getElement(inst_c->element()->signature()); + element_inst->buildSliceHTML(dom_storyline); + }break; + default: + break; } } } -StoryVolume::StoryVolume(std::shared_ptr handle) : Group(handle) {} +StoryVolume::StoryVolume(std::shared_ptr handle) : Group(handle) { +} void StoryVolume::buildPageHTML(QDomElement& parent) const { auto syntax_access = this->accessPeers(); @@ -97,46 +107,48 @@ void StoryVolume::buildPageHTML(QDomElement& parent) const { [&](QDomElement& parent_element, const QList> children) { for (auto& child : children) { auto doc_ins = parent_element.ownerDocument(); - switch ((NovelNode)child->element()->typeMark()) { - case NovelNode::TextSection: { - auto text_inst = std::dynamic_pointer_cast(child->element()); - auto dom_p = doc_ins.createElement("p"); - dom_p.appendChild(doc_ins.createTextNode(text_inst->content())); - parent_element.appendChild(dom_p); - }break; - case NovelNode::ArticleDefine: { - auto article_inst = std::dynamic_pointer_cast(child->element()); - auto article_group = doc_ins.createElement("div"); - auto article_head = doc_ins.createElement("h2"); - article_head.appendChild(doc_ins.createTextNode(article_inst->name() + u8"{")); - article_group.appendChild(article_head); - rich_refer_build(article_group, child->children()); - article_group.appendChild(doc_ins.createTextNode(u8"}")); - parent_element.appendChild(article_group); - }break; - case NovelNode::PointRefers:{ - auto fragment_inst = std::dynamic_pointer_cast(child->element()); - auto refer_inst = this->getElement(fragment_inst->signature()); - refer_inst->buildSliceHTML(parent_element); - }break; - default: - break; + switch ((NovelNode) child->element()->typeMark()) { + case NovelNode::TextSection: + { + auto text_inst = std::dynamic_pointer_cast(child->element()); + auto dom_p = doc_ins.createElement("p"); + dom_p.appendChild(doc_ins.createTextNode(text_inst->content())); + parent_element.appendChild(dom_p); + }break; + case NovelNode::ArticleDefine: + { + auto article_inst = std::dynamic_pointer_cast(child->element()); + auto article_group = doc_ins.createElement("div"); + auto article_head = doc_ins.createElement("h2"); + article_head.appendChild(doc_ins.createTextNode(article_inst->name() + "{")); + article_group.appendChild(article_head); + rich_refer_build(article_group, child->children()); + article_group.appendChild(doc_ins.createTextNode("}")); + parent_element.appendChild(article_group); + }break; + case NovelNode::PointRefers: + { + auto fragment_inst = std::dynamic_pointer_cast(child->element()); + auto refer_inst = this->getElement(fragment_inst->signature()); + refer_inst->buildSliceHTML(parent_element); + }break; + default: + break; } } - }; + }; rich_refer_build(dom_volume, syntax_access->children()); } -FragmentRef::FragmentRef(std::shared_ptr handle) : Element(handle) {} +FragmentRef::FragmentRef(std::shared_ptr handle) : Element(handle) { +} -void printer::FragmentRef::setHost(std::shared_ptr frag_inst) -{ +void printer::FragmentRef::setHost(std::shared_ptr frag_inst) { this->host_inst = frag_inst; } -std::shared_ptr printer::FragmentRef::hostFragment() const -{ +std::shared_ptr printer::FragmentRef::hostFragment() const { return this->host_inst.lock(); } @@ -147,44 +159,46 @@ void FragmentRef::buildSliceHTML(QDomElement& dom_parent) const { auto jump_to_host = this->hostFragment()->pageRefers(); auto doc = dom_parent.ownerDocument(); - auto dom_reference = doc.createElement(u8"div"); - dom_reference.setAttribute("id", QString::number((qulonglong)refer_element.get())); + auto dom_reference = doc.createElement("div"); + dom_reference.setAttribute("id", QString::number((qulonglong) refer_element.get())); dom_parent.appendChild(dom_reference); - auto dom_title = doc.createElement(u8"h2"); + auto dom_title = doc.createElement("h2"); dom_reference.appendChild(dom_title); - auto dom_href = doc.createElement(u8"a"); + auto dom_href = doc.createElement("a"); dom_href.appendChild(doc.createTextNode(refer_element->referSignature())); - dom_href.setAttribute("href", u8"file:///"+jump_to_host); + dom_href.setAttribute("href", "file:///" + jump_to_host); dom_title.appendChild(dom_href); std::function>&)> rich_refer_build = [&](QDomElement& parent_element, const QList> children) { for (auto& child : children) { auto doc_ins = parent_element.ownerDocument(); - switch ((NovelNode)child->element()->typeMark()) { - case NovelNode::TextSection: { - auto text_inst = std::dynamic_pointer_cast(child->element()); - auto dom_p = doc_ins.createElement("p"); - dom_p.appendChild(doc_ins.createTextNode(text_inst->content())); - parent_element.appendChild(dom_p); - }break; - case NovelNode::ArticleDefine: { - auto article_inst = std::dynamic_pointer_cast(child->element()); - auto article_group = doc_ins.createElement("div"); - auto article_head = doc_ins.createElement("h2"); - article_head.appendChild(doc_ins.createTextNode(article_inst->name() + u8"{")); - article_group.appendChild(article_head); - rich_refer_build(article_group, child->children()); - article_group.appendChild(doc_ins.createTextNode(u8"}")); - parent_element.appendChild(article_group); - }break; - default: - break; + switch ((NovelNode) child->element()->typeMark()) { + case NovelNode::TextSection: + { + auto text_inst = std::dynamic_pointer_cast(child->element()); + auto dom_p = doc_ins.createElement("p"); + dom_p.appendChild(doc_ins.createTextNode(text_inst->content())); + parent_element.appendChild(dom_p); + }break; + case NovelNode::ArticleDefine: + { + auto article_inst = std::dynamic_pointer_cast(child->element()); + auto article_group = doc_ins.createElement("div"); + auto article_head = doc_ins.createElement("h2"); + article_head.appendChild(doc_ins.createTextNode(article_inst->name() + "{")); + article_group.appendChild(article_head); + rich_refer_build(article_group, child->children()); + article_group.appendChild(doc_ins.createTextNode("}")); + parent_element.appendChild(article_group); + }break; + default: + break; } } - }; + }; rich_refer_build(dom_reference, syntax_access->children()); } @@ -195,20 +209,20 @@ void FragmentRef::buildPageHTML(QDomElement& parent) const { auto doc = parent.ownerDocument(); - auto refers_dom = doc.createElement(u8"div"); + auto refers_dom = doc.createElement("div"); parent.appendChild(refers_dom); - auto title_block = doc.createElement(u8"h2"); + auto title_block = doc.createElement("h2"); refers_dom.appendChild(title_block); - auto title_refer = doc.createElement(u8"a"); + auto title_refer = doc.createElement("a"); title_refer.appendChild(doc.createTextNode(refer_element->signature())); - title_refer.setAttribute("href", u8"file:///"+this->sliceRefers()); + title_refer.setAttribute("href", "file:///" + this->sliceRefers()); title_block.appendChild(title_refer); std::function>)> build_cascade = [&](QList> children_items) { for (auto child : children_items) { - if (child->element()->typeMark() == (int)NovelNode::TextSection) { + if (child->element()->typeMark() == (int) NovelNode::TextSection) { auto text_inst = std::dynamic_pointer_cast(child->element()); auto p = doc.createElement("p"); p.appendChild(doc.createTextNode(text_inst->content())); @@ -218,12 +232,13 @@ void FragmentRef::buildPageHTML(QDomElement& parent) const { build_cascade(child->children()); } } - }; + }; build_cascade(syntax_access->children()); } -Fragment::Fragment(std::shared_ptr handle) : Element(handle) {} +Fragment::Fragment(std::shared_ptr handle) : Element(handle) { +} void Fragment::appendRefers(std::shared_ptr inst) { this->additionals_store.append(inst); @@ -240,7 +255,7 @@ void Fragment::buildSliceHTML(QDomElement& parent) const { auto doc = parent.ownerDocument(); auto dom_fragment = doc.createElement("div"); - dom_fragment.setAttribute("id", QString::number((qulonglong)fragment_inst.get())); + dom_fragment.setAttribute("id", QString::number((qulonglong) fragment_inst.get())); parent.appendChild(dom_fragment); auto dom_title = doc.createElement("h2"); @@ -248,11 +263,11 @@ void Fragment::buildSliceHTML(QDomElement& parent) const { auto dom_href = doc.createElement("a"); dom_href.appendChild(doc.createTextNode(fragment_inst->name())); - dom_href.setAttribute("href", u8"file:///"+this->pageRefers()); + dom_href.setAttribute("href", "file:///" + this->pageRefers()); dom_title.appendChild(dom_href); for (auto& inst_c : syntax_access->children()) { - if (NovelNode::TextSection == (NovelNode)inst_c->element()->typeMark()) { + if (NovelNode::TextSection == (NovelNode) inst_c->element()->typeMark()) { auto text_inst = std::dynamic_pointer_cast(inst_c->element()); auto dom_p = doc.createElement("p"); dom_p.appendChild(doc.createTextNode(text_inst->content())); @@ -275,11 +290,11 @@ void Fragment::buildPageHTML(QDomElement& parent) const { auto dom_href = doc.createElement("a"); dom_href.appendChild(doc.createTextNode(fragment_inst->signature())); - dom_href.setAttribute("href", u8"file:///" + this->sliceRefers()); + dom_href.setAttribute("href", "file:///" + this->sliceRefers()); dom_title.appendChild(dom_href); for (auto& inst_c : syntax_access->children()) { - if (NovelNode::TextSection == (NovelNode)inst_c->element()->typeMark()) { + if (NovelNode::TextSection == (NovelNode) inst_c->element()->typeMark()) { auto text_inst = std::dynamic_pointer_cast(inst_c->element()); auto dom_p = doc.createElement("p"); dom_p.appendChild(doc.createTextNode(text_inst->content())); @@ -293,9 +308,8 @@ void Fragment::buildPageHTML(QDomElement& parent) const { } #include -void tools_printer::build_fragments(std::shared_ptr novel_root) -{ - if (novel_root->element()->typeMark() == (int)NovelNode::PointDefines) { +void tools_printer::build_fragments(std::shared_ptr novel_root) { + if (novel_root->element()->typeMark() == (int) NovelNode::PointDefines) { auto inst = std::make_shared(novel_root); auto name = novel_root->element()->signature(); this->fragment_defines[name] = inst; @@ -306,46 +320,47 @@ void tools_printer::build_fragments(std::shared_ptr novel_node) -{ - switch ((NovelNode)novel_node->element()->typeMark()) { - case NovelNode::StoryDefine: { - auto storyinst = std::make_shared(novel_node); - this->storyline_defines[novel_node->element()->signature()] = storyinst; - build_storyline(storyinst); - }return; - case NovelNode::VolumeDefine: { - auto volumeinst = std::make_shared(novel_node); - this->volume_defines[novel_node->element()->signature()] = volumeinst; - build_volumeline(volumeinst); - }return; +void tools_printer::build_refers_network(std::shared_ptr novel_node) { + switch ((NovelNode) novel_node->element()->typeMark()) { + case NovelNode::StoryDefine: + { + auto storyinst = std::make_shared(novel_node); + this->storyline_defines[novel_node->element()->signature()] = storyinst; + build_storyline(storyinst); + }return; + case NovelNode::VolumeDefine: + { + auto volumeinst = std::make_shared(novel_node); + this->volume_defines[novel_node->element()->signature()] = volumeinst; + build_volumeline(volumeinst); + }return; } for (auto& inst_c : novel_node->children()) build_refers_network(inst_c); } -void tools_printer::build_storyline(std::shared_ptr line, std::shared_ptr novel_node) -{ +void tools_printer::build_storyline(std::shared_ptr line, std::shared_ptr novel_node) { if (!novel_node) { for (auto& inst_c : line->accessPeers()->children()) { build_storyline(line, inst_c); } } else { - switch ((NovelNode)novel_node->element()->typeMark()) - { - case NovelNode::PointDefines: { - auto inst = this->fragment_defines[novel_node->element()->signature()]; - line->append(inst); - }return; - case NovelNode::PointRefers: { - auto refer_node = std::dynamic_pointer_cast(novel_node->element()); - auto refer_fragment = this->fragment_defines[refer_node->referSignature()]; - auto inst = std::make_shared(novel_node); - refer_fragment->appendRefers(inst); - line->append(inst); - }return; + switch ((NovelNode) novel_node->element()->typeMark()) { + case NovelNode::PointDefines: + { + auto inst = this->fragment_defines[novel_node->element()->signature()]; + line->append(inst); + }return; + case NovelNode::PointRefers: + { + auto refer_node = std::dynamic_pointer_cast(novel_node->element()); + auto refer_fragment = this->fragment_defines[refer_node->referSignature()]; + auto inst = std::make_shared(novel_node); + refer_fragment->appendRefers(inst); + line->append(inst); + }return; } for (auto& inst_c : novel_node->children()) @@ -353,14 +368,13 @@ void tools_printer::build_storyline(std::shared_ptr line, std::shared } } -void tools_printer::build_volumeline(std::shared_ptr volume, std::shared_ptr novel_node) -{ +void tools_printer::build_volumeline(std::shared_ptr volume, std::shared_ptr novel_node) { if (!novel_node) { for (auto& inst_c : volume->accessPeers()->children()) build_volumeline(volume, inst_c); } else { - if (NovelNode::PointRefers == (NovelNode)novel_node->element()->typeMark()) { + if (NovelNode::PointRefers == (NovelNode) novel_node->element()->typeMark()) { auto refer_node = std::dynamic_pointer_cast(novel_node->element()); auto refer_fragment = this->fragment_defines[refer_node->referSignature()]; auto inst = std::make_shared(novel_node); @@ -381,7 +395,7 @@ void tools_printer::fragments_anchors_define(const QListaccessPeers()->element().get()); + auto address_x = QString::number((qulonglong) it->accessPeers()->element().get()); it->setPageRefers(target_dir.absoluteFilePath(QString("%1.html").arg(address_x))); } } @@ -389,10 +403,10 @@ void tools_printer::fragments_anchors_define(const QList>&, const QString&)> refers_refresh = [&](const QList>& items, const QString& summary_href) { for (auto& item : items) { - auto element_addr = QString::number((qulonglong)item->accessPeers()->element().get()); - item->setSliceRefer(summary_href + u8"#" + element_addr); + auto element_addr = QString::number((qulonglong) item->accessPeers()->element().get()); + item->setSliceRefer(summary_href + "#" + element_addr); } -}; + }; void tools_printer::storylines_anchors_define(const QList>& list, const QDir& root_dir) { auto path = root_dir.filePath("storylines"); @@ -401,7 +415,7 @@ void tools_printer::storylines_anchors_define(const QListaccessPeers()->element().get()); + auto address_x = QString::number((qulonglong) it->accessPeers()->element().get()); auto page_address = target_dir.absoluteFilePath(QString("%1.html").arg(address_x)); it->setPageRefers(page_address); refers_refresh(it->elements(), page_address); @@ -415,60 +429,60 @@ void tools_printer::volumes_anchors_define(const QListaccessPeers()->element().get()); + auto address_x = QString::number((qulonglong) it->accessPeers()->element().get()); auto page_address = target_dir.absoluteFilePath(QString("%1.html").arg(address_x)); it->setPageRefers(page_address); refers_refresh(it->elements(), page_address); } } -auto get_node_name = [](const std::shared_ptr item){ - return u8"node_" + QString::number((qulonglong)item->accessPeers()->element().get()); -}; +auto get_node_name = [](const std::shared_ptr item) { + return "node_" + QString::number((qulonglong) item->accessPeers()->element().get()); + }; -QString printer::tools_printer::storylines_paint(const QList> &lines) { +QString printer::tools_printer::storylines_paint(const QList>& lines) { QHash> node_records; QString nodes_description; for (auto& story : lines) { auto story_elem = std::dynamic_pointer_cast(story->accessPeers()->element()); node_records[story_elem->signature()] = story; - nodes_description += get_node_name(story) + QString(u8"[fillcolor=pink,label=\"%1{%2}\",shape=\"cds\"]\n").arg(story_elem->name()).arg(story_elem->sort()); + nodes_description += get_node_name(story) + QString("[fillcolor=pink,label=\"%1{%2}\",shape=\"cds\"]\n").arg(story_elem->name()).arg(story_elem->sort()); - for (auto &frag : story->elements()) { + for (auto& frag : story->elements()) { auto fragment_peers = frag->accessPeers()->element(); - if (fragment_peers->typeMark() == (int)example_novel::NovelNode::PointDefines) { + if (fragment_peers->typeMark() == (int) example_novel::NovelNode::PointDefines) { auto fragment_elem = std::dynamic_pointer_cast(fragment_peers); auto node_name = fragment_elem->signature(); node_records[node_name] = frag; - nodes_description += get_node_name(frag) + QString(u8"[label=\"{%2}::%1\",shape=\"rect\"]\n") - .arg(fragment_elem->name()).arg(story_elem->sort()); + nodes_description += get_node_name(frag) + QString("[label=\"{%2}::%1\",shape=\"rect\"]\n") + .arg(fragment_elem->name()).arg(story_elem->sort()); } } } QString arrows_link; - for (auto &story : lines) { + for (auto& story : lines) { auto story_elem = std::dynamic_pointer_cast(story->accessPeers()->element()); QString previous_node = get_node_name(story); - for (auto &frag : story->elements()) { + for (auto& frag : story->elements()) { if (example_novel::NovelNode::PointDefines == (example_novel::NovelNode) frag->accessPeers()->element()->typeMark()) { - arrows_link += previous_node + u8"->" + get_node_name(frag) + QString(u8"[label=\"%1{%2}\"]\n") - .arg(story_elem->name()).arg(story_elem->sort()); + arrows_link += previous_node + "->" + get_node_name(frag) + QString("[label=\"%1{%2}\"]\n") + .arg(story_elem->name()).arg(story_elem->sort()); previous_node = get_node_name(frag); } - else if (example_novel::NovelNode::PointRefers == (example_novel::NovelNode)frag->accessPeers()->element()->typeMark()) { + else if (example_novel::NovelNode::PointRefers == (example_novel::NovelNode) frag->accessPeers()->element()->typeMark()) { auto frag_refer = std::dynamic_pointer_cast(frag->accessPeers()->element()); auto frag_src = node_records[frag_refer->referSignature()]; - arrows_link += previous_node + u8"->" + get_node_name(frag_src) + QString(u8"[label=\"%1{%2}\"]\n") - .arg(story_elem->name()).arg(story_elem->sort()); + arrows_link += previous_node + "->" + get_node_name(frag_src) + QString("[label=\"%1{%2}\"]\n") + .arg(story_elem->name()).arg(story_elem->sort()); previous_node = get_node_name(frag_src); } } } - return QString(u8"digraph{ rankdir = LR \n node[style=filled] \n %1\n %2 }").arg(nodes_description).arg(arrows_link); + return QString("digraph{ rankdir = LR \n node[style=filled] \n %1\n %2 }").arg(nodes_description).arg(arrows_link); } QString printer::tools_printer::volumes_paint(const QList>& vols, const QList>& lines) { @@ -477,49 +491,48 @@ QString printer::tools_printer::volumes_paint(const QListelements()) { + for (auto& frag : story->elements()) { auto fragment_peers = frag->accessPeers()->element(); - if (fragment_peers->typeMark() == (int)example_novel::NovelNode::PointDefines) { + if (fragment_peers->typeMark() == (int) example_novel::NovelNode::PointDefines) { auto fragment_elem = std::dynamic_pointer_cast(fragment_peers); node_records[fragment_elem->signature()] = frag; - nodes_description += get_node_name(frag) + QString(u8"[label=\"%1\",shape=\"ellipse\"]\n").arg(fragment_elem->name()); + nodes_description += get_node_name(frag) + QString("[label=\"%1\",shape=\"ellipse\"]\n").arg(fragment_elem->name()); } } auto story_elem = std::dynamic_pointer_cast(story->accessPeers()->element()); - clusters_description += QString(u8"subgraph cluster_%1 { label=%3 \n %2 }") - .arg((qulonglong)story_elem.get()).arg(nodes_description).arg(story_elem->name()); + clusters_description += QString("subgraph cluster_%1 { label=%3 \n %2 }") + .arg((qulonglong) story_elem.get()).arg(nodes_description).arg(story_elem->name()); } - auto article_cluster = [&node_records]( - const std::shared_ptr article_access, QList &arrows_out)->QString { + auto article_cluster = [&node_records](const std::shared_ptr article_access, QList& arrows_out)->QString { QString nodes_description; for (auto& fragment_access : article_access->children()) { - if (fragment_access->element()->typeMark() == (int)example_novel::NovelNode::PointRefers) { + if (fragment_access->element()->typeMark() == (int) example_novel::NovelNode::PointRefers) { auto refer_fragment = std::dynamic_pointer_cast(fragment_access->element()); - nodes_description += QString(u8"fragment_%1[label=\"%2\",shape=\"plaintext\"]\n") - .arg((qulonglong)refer_fragment.get()).arg(refer_fragment->fragmentRefer()); + nodes_description += QString("fragment_%1[label=\"%2\",shape=\"plaintext\"]\n") + .arg((qulonglong) refer_fragment.get()).arg(refer_fragment->sliceRefer()); auto symbo_refer = node_records[refer_fragment->referSignature()]; - arrows_out << QString(u8"fragment_%1 -- %2[color=\"red\"]\n").arg((qulonglong)refer_fragment.get()).arg(get_node_name(symbo_refer)); + arrows_out << QString("fragment_%1 -- %2[color=\"red\"]\n").arg((qulonglong) refer_fragment.get()).arg(get_node_name(symbo_refer)); } } auto article_define = std::dynamic_pointer_cast(article_access->element()); - return QString(u8"subgraph cluster_%1{ label=%2 \n %3 }\n").arg((qulonglong)article_access->element().get()) + return QString("subgraph cluster_%1{ label=%2 \n %3 }\n").arg((qulonglong) article_access->element().get()) .arg(article_define->name()).arg(nodes_description); - }; + }; QString arrows_link; - for (auto &vol : vols) { + for (auto& vol : vols) { QString members_description; for (auto& eref : vol->accessPeers()->children()) { QList arrows_temp; - switch ((example_novel::NovelNode)eref->element()->typeMark()){ - case example_novel::NovelNode::ArticleDefine: - members_description += article_cluster(eref, arrows_temp); - break; - default: - break; + switch ((example_novel::NovelNode) eref->element()->typeMark()) { + case example_novel::NovelNode::ArticleDefine: + members_description += article_cluster(eref, arrows_temp); + break; + default: + break; } for (auto& arrow : arrows_temp) { arrows_link += arrow; @@ -527,8 +540,8 @@ QString printer::tools_printer::volumes_paint(const QList(vol->accessPeers()->element()); - clusters_description += QString(u8"subgraph cluster_%1 { label=%3 \n %2 }") - .arg((qulonglong)volume_elem.get()).arg(members_description).arg(volume_elem->name()); + clusters_description += QString("subgraph cluster_%1 { label=%3 \n %2 }") + .arg((qulonglong) volume_elem.get()).arg(members_description).arg(volume_elem->name()); } return QString("graph scale{ %1 \n %2}").arg(clusters_description).arg(arrows_link); @@ -537,8 +550,7 @@ QString printer::tools_printer::volumes_paint(const QList #include #include -void printer::tools_printer::plain_html_output(const std::shared_ptr access_ptr, const QDir& destination_dir) const -{ +void printer::tools_printer::plain_html_output(const std::shared_ptr access_ptr, const QDir& destination_dir) const { QTime time_stamp = QTime::currentTime(); auto tool = *this; tool.build_fragments(access_ptr); @@ -553,11 +565,11 @@ void printer::tools_printer::plain_html_output(const std::shared_ptrpageRefers(); QFile tfile(target_path); if (tfile.open(QIODevice::WriteOnly | QIODevice::Text)) { - QDomDocument doc_inst(QDomImplementation().createDocumentType(u8"html", QString(), QString())); - auto html = doc_inst.createElement(u8"html"); + QDomDocument doc_inst(QDomImplementation().createDocumentType("html", QString(), QString())); + auto html = doc_inst.createElement("html"); doc_inst.appendChild(html); - auto body = doc_inst.createElement(u8"body"); + auto body = doc_inst.createElement("body"); html.appendChild(body); inst->buildPageHTML(body); @@ -566,7 +578,7 @@ void printer::tools_printer::plain_html_output(const std::shared_ptrpageRefers()); + line_href.setAttribute("href", "file:///" + inst_line->pageRefers()); auto a_elm = std::dynamic_pointer_cast(inst_line->accessPeers()->element()); - line_href.appendChild(doc_inst.createTextNode(QString(u8"%1.%2").arg(a_elm->sort()).arg(a_elm->signature()))); + line_href.appendChild(doc_inst.createTextNode(QString("%1.%2").arg(a_elm->sort()).arg(a_elm->signature()))); dom_line.appendChild(line_href); } auto dom_volume = doc_inst.createElement("div"); auto dom_volume_title = doc_inst.createElement("h2"); - dom_volume_title.appendChild(doc_inst.createTextNode(u8"分卷内容")); + dom_volume_title.appendChild(doc_inst.createTextNode("鍒嗗嵎鍐呭")); dom_volume.appendChild(dom_volume_title); body.appendChild(dom_volume); @@ -641,25 +653,25 @@ void printer::tools_printer::plain_html_output(const std::shared_ptrpageRefers()); + volume_href.setAttribute("href", "file:///" + inst_volume->pageRefers()); volume_href.appendChild(doc_inst.createTextNode(inst_volume->accessPeers()->element()->signature())); dom_volume_ref.appendChild(volume_href); } auto dom_fragment = doc_inst.createElement("div"); auto dom_fragment_title = doc_inst.createElement("h2"); - dom_fragment_title.appendChild(doc_inst.createTextNode(u8"情节集合")); + dom_fragment_title.appendChild(doc_inst.createTextNode("鎯呰妭闆嗗悎")); dom_fragment.appendChild(dom_fragment_title); body.appendChild(dom_fragment); - auto table_cube = doc_inst.createElement(u8"table"); + auto table_cube = doc_inst.createElement("table"); dom_fragment.appendChild(table_cube); int row_ctrl = 0; QDomElement elm_row; for (auto& inst_frag : tool.fragment_defines) { if (row_ctrl++ % 4 == 0) { - elm_row = doc_inst.createElement(u8"tr"); + elm_row = doc_inst.createElement("tr"); table_cube.appendChild(elm_row); } @@ -667,23 +679,23 @@ void printer::tools_printer::plain_html_output(const std::shared_ptrpageRefers()); + frag_href.setAttribute("href", "file:///" + inst_frag->pageRefers()); frag_href.appendChild(doc_inst.createTextNode(inst_frag->accessPeers()->element()->signature())); dom_fragment_ref.appendChild(frag_href); } - auto dom_relate = doc_inst.createElement(u8"div"); - auto dom_relate_title = doc_inst.createElement(u8"h2"); - dom_relate_title.appendChild(doc_inst.createTextNode(u8"联系图")); + auto dom_relate = doc_inst.createElement("div"); + auto dom_relate_title = doc_inst.createElement("h2"); + dom_relate_title.appendChild(doc_inst.createTextNode("鑱旂郴鍥")); dom_relate.appendChild(dom_relate_title); body.appendChild(dom_relate); - auto img = doc_inst.createElement(u8"img"); - img.setAttribute(u8"src", u8"file:///" + QDir::current().filePath(u8"relates.svg")); + auto img = doc_inst.createElement("img"); + img.setAttribute("src", "file:///" + QDir::current().filePath("relates.svg")); dom_relate.appendChild(img); dom_relate.appendChild(doc_inst.createElement("br")); - img = doc_inst.createElement(u8"img"); - img.setAttribute(u8"src", u8"file:///" + QDir::current().filePath(u8"volumes_group.svg")); + img = doc_inst.createElement("img"); + img.setAttribute("src", "file:///" + QDir::current().filePath("volumes_group.svg")); dom_relate.appendChild(img); QTextStream tout(&tfile); @@ -693,32 +705,31 @@ void printer::tools_printer::plain_html_output(const std::shared_ptr inst) { - auto dom_tokens = doc.createElement(u8"tokens"); + auto dom_tokens = doc.createElement("tokens"); _elm.appendChild(dom_tokens); for (auto& token : inst->selfTokens()) { - auto dom_token = doc.createElement(u8"token"); + auto dom_token = doc.createElement("token"); dom_tokens.appendChild(dom_token); - dom_token.setAttribute(u8"text", token->token()->content()); - dom_token.setAttribute(u8"row", token->token()->row()); - dom_token.setAttribute(u8"col", token->token()->column()); + dom_token.setAttribute("text", token->token()->content()); + dom_token.setAttribute("row", token->token()->row()); + dom_token.setAttribute("col", token->token()->column()); } } -printer::AstGenerate::AstGenerate(const QDir &src_rt) -: src_root(src_rt) { +printer::AstGenerate::AstGenerate(const QDir& src_rt) + : src_root(src_rt) { auto procs = doc.createProcessingInstruction("xml", "version='1.0' encoding='utf-8'"); doc.appendChild(procs); } -QString printer::AstGenerate::content() const -{ +QString printer::AstGenerate::content() const { return doc.toString(2); } @@ -728,125 +739,153 @@ VisitMode printer::AstGenerate::mode() const { #include bool printer::AstGenerate::visit(std::shared_ptr syntax_element) { - switch ((NovelNode)syntax_element->element()->typeMark()) { - case NovelNode::GlobalElement:{ - auto body = doc.createElement(u8"ast"); - doc.appendChild(body); - body.setAttribute(u8"time", QDateTime::currentDateTime().toString(u8"yyyyMMdd_hhmmss")); - body.setAttribute(u8"dir_src", src_root.absolutePath()); - element_stack.append(body); - }break; - case NovelNode::Document: break; - case NovelNode::StoryDefine:{ - while (element_stack.last().tagName() != u8"ast") { - element_stack.takeLast(); - } + switch ((NovelNode) syntax_element->element()->typeMark()) { + case NovelNode::GlobalElement: + { + auto body = doc.createElement("ast"); + doc.appendChild(body); + body.setAttribute("time", QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss")); + body.setAttribute("dir_src", src_root.absolutePath()); + element_stack.append(body); + }break; + case NovelNode::Document: break; + case NovelNode::StoryDefine: + { + while (element_stack.last().tagName() != "ast") { + element_stack.takeLast(); + } - auto current_ast = element_stack.last(); - auto story_node = std::dynamic_pointer_cast(syntax_element->element()); - auto dom_story = doc.createElement(u8"story"); - current_ast.appendChild(dom_story); - element_stack.append(dom_story); + auto current_ast = element_stack.last(); + auto story_node = std::dynamic_pointer_cast(syntax_element->element()); + auto dom_story = doc.createElement("story"); + current_ast.appendChild(dom_story); + element_stack.append(dom_story); - dom_story.setAttribute(u8"name", story_node->name()); - dom_story.setAttribute(u8"address", (qulonglong)story_node.get()); - dom_story.setAttribute(u8"file-path", src_root.relativeFilePath(story_node->filePath())); - dom_story.setAttribute(u8"sort", story_node->sort()); + dom_story.setAttribute("name", story_node->name()); + dom_story.setAttribute("address", (qulonglong) story_node.get()); + dom_story.setAttribute("file-path", src_root.relativeFilePath(story_node->filePath())); + dom_story.setAttribute("sort", story_node->sort()); - append_tokens(dom_story, story_node); - }break; - case NovelNode::PointDefines: { - while (element_stack.last().tagName() != u8"story") { - element_stack.takeLast(); - } + append_tokens(dom_story, story_node); + }break; + case NovelNode::FragmentSlice: + { + while (element_stack.last().tagName() != "story") { + element_stack.takeLast(); + } - auto current_story = element_stack.last(); - auto fragment_node = std::dynamic_pointer_cast(syntax_element->element()); - auto dom_fragment = doc.createElement(u8"fragment"); - current_story.appendChild(dom_fragment); - element_stack.append(dom_fragment); + auto current_story = element_stack.last(); + auto slice_node = std::dynamic_pointer_cast(syntax_element->element()); + auto dom_slice = doc.createElement("slice"); + current_story.appendChild(dom_slice); + element_stack.append(dom_slice); - dom_fragment.setAttribute(u8"name", fragment_node->name()); - dom_fragment.setAttribute(u8"address", (qulonglong)fragment_node.get()); - dom_fragment.setAttribute(u8"file-path", src_root.relativeFilePath(fragment_node->filePath())); + dom_slice.setAttribute("name", slice_node->name()); + dom_slice.setAttribute("address", (qulonglong) slice_node.get()); + }break; + case NovelNode::PointDefines: + { + while (element_stack.last().tagName() != "slice") { + element_stack.takeLast(); + } - append_tokens(dom_fragment, fragment_node); - }break; - case NovelNode::TextSection:{ - auto current_text = element_stack.last(); - auto text_node = std::dynamic_pointer_cast(syntax_element->element()); - auto dom_text = doc.createElement(u8"text-section"); - current_text.appendChild(dom_text); + auto current_slice = element_stack.last(); + auto point_node = std::dynamic_pointer_cast(syntax_element->element()); + auto dom_point = doc.createElement("point"); + current_slice.appendChild(dom_point); + element_stack.append(dom_point); - dom_text.setAttribute(u8"text", text_node->content()); - dom_text.setAttribute(u8"file-path", src_root.relativeFilePath(text_node->filePath())); + dom_point.setAttribute("name", point_node->name()); + dom_point.setAttribute("address", (qulonglong) point_node.get()); + dom_point.setAttribute("file-path", src_root.relativeFilePath(point_node->filePath())); - append_tokens(dom_text, text_node); - }break; - case NovelNode::PointRefers:{ - while (element_stack.last().tagName() != u8"article" && element_stack.last().tagName() != u8"story") { - element_stack.takeLast(); - } + append_tokens(dom_point, point_node); + }break; + case NovelNode::TextSection: + { + while (element_stack.last().tagName() == "text") { + element_stack.takeLast(); + } - auto current_pnode = element_stack.last(); - auto refer_node = std::dynamic_pointer_cast(syntax_element->element()); - auto dom_refer = doc.createElement(u8"refer"); - element_stack.append(dom_refer); - current_pnode.appendChild(dom_refer); + auto current_pnode = element_stack.last(); + auto text_node = std::dynamic_pointer_cast(syntax_element->element()); + auto dom_text = doc.createElement("text-section"); + current_pnode.appendChild(dom_text); - dom_refer.setAttribute(u8"story", refer_node->storyRefer()); - dom_refer.setAttribute(u8"fragment", refer_node->fragmentRefer()); - dom_refer.setAttribute(u8"file-path", src_root.relativeFilePath(refer_node->filePath())); + dom_text.setAttribute("text", text_node->content()); + dom_text.setAttribute("file-path", src_root.relativeFilePath(text_node->filePath())); - append_tokens(dom_refer, refer_node); - }break; - case NovelNode::VolumeDefine:{ - while (element_stack.last().tagName() != u8"ast") { - element_stack.takeLast(); - } + append_tokens(dom_text, text_node); + }break; + case NovelNode::PointRefers: + { + while (element_stack.last().tagName() != "article" && element_stack.last().tagName() != "slice") { + element_stack.takeLast(); + } - auto current_ast = element_stack.last(); - auto volume_node = std::dynamic_pointer_cast(syntax_element->element()); - auto dom_volume = doc.createElement(u8"volume"); - current_ast.appendChild(dom_volume); - element_stack.append(dom_volume); + auto current_pnode = element_stack.last(); + auto refer_node = std::dynamic_pointer_cast(syntax_element->element()); + auto dom_refer = doc.createElement("refer"); + element_stack.append(dom_refer); + current_pnode.appendChild(dom_refer); - dom_volume.setAttribute(u8"name", volume_node->name()); - dom_volume.setAttribute(u8"address", (qulonglong)volume_node.get()); - dom_volume.setAttribute(u8"file-path", src_root.relativeFilePath(volume_node->filePath())); + dom_refer.setAttribute("story", refer_node->storyRefer()); + dom_refer.setAttribute("slice", refer_node->sliceRefer()); + dom_refer.setAttribute("point", refer_node->pointRefer()); + dom_refer.setAttribute("file-path", src_root.relativeFilePath(refer_node->filePath())); - append_tokens(dom_volume, volume_node); - }break; - case NovelNode::ArticleDefine:{ - while (element_stack.last().tagName() != u8"volume") { - element_stack.takeLast(); - } + append_tokens(dom_refer, refer_node); + }break; + case NovelNode::VolumeDefine: + { + while (element_stack.last().tagName() != "ast") { + element_stack.takeLast(); + } - auto current_volume = element_stack.last(); - auto article_node = std::dynamic_pointer_cast(syntax_element->element()); - auto dom_article = doc.createElement(u8"article"); - current_volume.appendChild(dom_article); - element_stack.append(dom_article); + auto current_ast = element_stack.last(); + auto volume_node = std::dynamic_pointer_cast(syntax_element->element()); + auto dom_volume = doc.createElement("volume"); + current_ast.appendChild(dom_volume); + element_stack.append(dom_volume); - dom_article.setAttribute(u8"name", article_node->name()); - dom_article.setAttribute(u8"address", (qulonglong)article_node.get()); - dom_article.setAttribute(u8"file-path", src_root.relativeFilePath(article_node->filePath())); + dom_volume.setAttribute("name", volume_node->name()); + dom_volume.setAttribute("address", (qulonglong) volume_node.get()); + dom_volume.setAttribute("file-path", src_root.relativeFilePath(volume_node->filePath())); - append_tokens(dom_article, article_node); - }break; - case NovelNode::RankDeclaration:{ - auto ast_element = element_stack.first(); - auto rank_node = std::dynamic_pointer_cast(syntax_element->element()); - auto dom_rank = doc.createElement(u8"rank"); - ast_element.appendChild(dom_rank); + append_tokens(dom_volume, volume_node); + }break; + case NovelNode::ArticleDefine: + { + while (element_stack.last().tagName() != "volume") { + element_stack.takeLast(); + } - dom_rank.setAttribute(u8"rank", rank_node->rankNumber()); - dom_rank.setAttribute(u8"doc-path", src_root.relativeFilePath(rank_node->filePath())); + auto current_volume = element_stack.last(); + auto article_node = std::dynamic_pointer_cast(syntax_element->element()); + auto dom_article = doc.createElement("article"); + current_volume.appendChild(dom_article); + element_stack.append(dom_article); - append_tokens(dom_rank, rank_node); - }break; - default: - break; + dom_article.setAttribute("name", article_node->name()); + dom_article.setAttribute("address", (qulonglong) article_node.get()); + dom_article.setAttribute("file-path", src_root.relativeFilePath(article_node->filePath())); + + append_tokens(dom_article, article_node); + }break; + case NovelNode::RankDeclaration: + { + auto ast_element = element_stack.first(); + auto rank_node = std::dynamic_pointer_cast(syntax_element->element()); + auto dom_rank = doc.createElement("rank"); + ast_element.appendChild(dom_rank); + + dom_rank.setAttribute("rank", rank_node->rankNumber()); + dom_rank.setAttribute("doc-path", src_root.relativeFilePath(rank_node->filePath())); + + append_tokens(dom_rank, rank_node); + }break; + default: + break; } return true; diff --git a/WsNovelParser/htmlprint.h b/WsNovelParser/htmlprint.h index 7b83a0f..de902b8 100644 --- a/WsNovelParser/htmlprint.h +++ b/WsNovelParser/htmlprint.h @@ -9,7 +9,7 @@ namespace printer { /* - * @brief 所有可访问元素的基类:卷宗、故事线、情节等 + * @brief 鎵鏈夊彲璁块棶鍏冪礌鐨勫熀绫伙細鍗峰畻銆佹晠浜嬬嚎銆佸墽鎯呫佽妭鐐圭瓑 */ class Access : public std::enable_shared_from_this { public: @@ -17,20 +17,20 @@ namespace printer { virtual ~Access() = default; /* - * @brief 获取绑定的语法元素 - * @return 元素内存指针 + * @brief 鑾峰彇缁戝畾鐨勮娉曞厓绱 + * @return 鍏冪礌鍐呭瓨鎸囬拡 */ std::shared_ptr accessPeers() const; /* - * @brief 设置汇总页面路径 - * @param href 页面路径 + * @brief 璁剧疆姹囨婚〉闈㈣矾寰 + * @param href 椤甸潰璺緞 */ void setPageRefers(const QString& href); QString pageRefers() const; /* - * @brief 获取汇总页面的HTML + * @brief 鑾峰彇姹囨婚〉闈㈢殑HTML */ virtual void buildPageHTML(QDomElement& doc) const = 0; @@ -40,7 +40,7 @@ namespace printer { }; /* - * @brief 可访问片段元素:故事片段本篇,故事片段引用 + * @brief 鍙闂墖娈靛厓绱狅細鏁呬簨鐗囨鏈瘒锛屾晠浜嬬墖娈靛紩鐢 */ class Element : public Access { public: @@ -48,13 +48,13 @@ namespace printer { virtual ~Element() = default; /* - * @brief 设置片段URL,从故事汇总页面跳转回出处页面 + * @brief 璁剧疆鐗囨URL锛屼粠鏁呬簨姹囨婚〉闈㈣烦杞洖鍑哄椤甸潰 */ virtual void setSliceRefer(const QString& href); virtual QString sliceRefers() const; /* - * @brief 获取故事片段出处的节点HTML + * @brief 鑾峰彇鏁呬簨鐗囨鍑哄鐨勮妭鐐笻TML */ virtual void buildSliceHTML(QDomElement &doc) const = 0; @@ -63,7 +63,7 @@ namespace printer { }; /* - * @brief 可访问集合的基类:故事线、故事卷宗 + * @brief 鍙闂泦鍚堢殑鍩虹被锛氭晠浜嬬嚎銆佸墽鎯呰妭鐐广佹晠浜嬪嵎瀹 */ class Group : public Access { public: @@ -82,7 +82,7 @@ namespace printer { public: StoryLine(std::shared_ptr handle); - // 通过 Group 继承 + // 閫氳繃 Group 缁ф壙 void buildPageHTML(QDomElement& doc) const override; }; @@ -91,13 +91,13 @@ namespace printer { public: StoryVolume(std::shared_ptr handle); - // 通过 Group 继承 + // 閫氳繃 Group 缁ф壙 void buildPageHTML(QDomElement& doc) const override; }; class Fragment; /* - * @brief 情节片段引用定义 + * @brief 鎯呰妭鐗囨寮曠敤瀹氫箟 */ class FragmentRef : public Element { public: @@ -106,10 +106,10 @@ namespace printer { void setHost(std::shared_ptr frag_inst); std::shared_ptr hostFragment() const; - // 通过 Access 继承 + // 閫氳繃 Access 缁ф壙 void buildPageHTML(QDomElement& doc) const override; - // 通过 Element 继承 + // 閫氳繃 Element 缁ф壙 void buildSliceHTML(QDomElement& doc) const override; private: @@ -117,7 +117,7 @@ namespace printer { }; /* - * @brief 情节片段本篇定义,存储情节引用定义 + * @brief 鎯呰妭鐗囨鏈瘒瀹氫箟锛屽瓨鍌ㄦ儏鑺傚紩鐢ㄥ畾涔 */ class Fragment : public Element{ private: @@ -129,10 +129,10 @@ namespace printer { void appendRefers(std::shared_ptr inst); QList> additionals() const; - // 通过 Access 继承 + // 閫氳繃 Access 缁ф壙 void buildPageHTML(QDomElement& doc) const override; - // 通过 Element 继承 + // 閫氳繃 Element 缁ф壙 void buildSliceHTML(QDomElement& doc) const override; }; @@ -161,6 +161,9 @@ namespace printer { void plain_html_output(const std::shared_ptr root, const QDir &destinationdir) const; }; + /** + * @brief Ast杈撳嚭鏋勫缓鍣. + */ class AstGenerate : public lib_parse::TreeVisitor { private: QDir src_root; @@ -174,8 +177,8 @@ namespace printer { QString content() const; - // 通过 TreeVisitor 继承 + // 閫氳繃 TreeVisitor 缁ф壙 lib_parse::VisitMode mode() const override; - bool visit(std::shared_ptr syntax_element) override; + bool visit(std::shared_ptr ast_element) override; }; } \ No newline at end of file diff --git a/WsNovelParser/main.cpp b/WsNovelParser/main.cpp index 443f243..69c300f 100644 --- a/WsNovelParser/main.cpp +++ b/WsNovelParser/main.cpp @@ -25,35 +25,35 @@ int main(int argc, char* argv[]) { QCoreApplication a(argc, argv); ArgsParser args_parser; - auto help_mode = make_shared(0x000Au, u8"打印帮助信息"); + auto help_mode = make_shared(0x000Au, "鎵撳嵃甯姪淇℃伅"); args_parser << help_mode; - *help_mode << make_shared(u8"nsc", u8"程序名称") - << make_shared(u8"help", u8"帮助"); + *help_mode << make_shared("nsc", "绋嬪簭鍚嶇О") + << make_shared("help", "甯姪"); - auto build_mode = make_shared(0x000Bu, u8"执行故事线编译任务"); + auto build_mode = make_shared(0x000Bu, "鎵ц鏁呬簨绾跨紪璇戜换鍔"); args_parser << build_mode; - *build_mode << make_shared(u8"nsc", u8"程序名称") - << make_shared(u8"path", u8"指定源代码目录") - << make_shared(u8"dest", u8"指定生成目录") - << make_shared(u8"html", u8"生成html文件格式取代AST", true); + *build_mode << make_shared("nsc", "绋嬪簭鍚嶇О") + << make_shared("path", "鎸囧畾婧愪唬鐮佺洰褰") + << make_shared("dest", "鎸囧畾鐢熸垚鐩綍") + << make_shared("html", "鐢熸垚html鏂囦欢鏍煎紡鍙栦唬AST", true); auto p_result = args_parser.parse(argc, argv); if (!p_result) { - qDebug().noquote() << u8"命令行参数错误!"; + qDebug().noquote() << "鍛戒护琛屽弬鏁伴敊璇紒"; qDebug().noquote() << args_parser.helperDoc(); } else { switch (p_result->modeCode()) { case 0xBu: { - auto src_dir = dynamic_pointer_cast(p_result->getUnitViaKey(u8"path")); - auto dst_dir = dynamic_pointer_cast(p_result->getUnitViaKey(u8"dest")); - auto html_opt = dynamic_pointer_cast(p_result->getUnitViaKey(u8"html")); + auto src_dir = dynamic_pointer_cast(p_result->getUnitViaKey("path")); + auto dst_dir = dynamic_pointer_cast(p_result->getUnitViaKey("dest")); + auto html_opt = dynamic_pointer_cast(p_result->getUnitViaKey("html")); auto source_dir = QDir(src_dir->value().toString()); if (!source_dir.exists()) { - cout << "%编译指定的源代码目录不存在!" << endl; + cout << "%缂栬瘧鎸囧畾鐨勬簮浠g爜鐩綍涓嶅瓨鍦紒" << endl; exit(0); } auto destination_dir = QDir::current(); @@ -62,7 +62,7 @@ int main(int argc, char* argv[]) { destination_dir = QDir(target_output.toString()); } else { - cout << "%编译指定的生成目录不存在,重置为:" << destination_dir.absolutePath().toLocal8Bit().data() << endl; + cout << "%缂栬瘧鎸囧畾鐨勭敓鎴愮洰褰曚笉瀛樺湪锛岄噸缃负锛" << destination_dir.absolutePath().toLocal8Bit().data() << endl; } auto files = source_dir.entryInfoList(QStringList() << "*.story"); @@ -81,7 +81,7 @@ int main(int argc, char* argv[]) { } access_ptr = parser->validsApply(docs); } - catch (SyntaxException* e) { + catch (lib_syntax::SyntaxException* e) { qDebug().noquote() << e->message(); delete e; exit(0); @@ -99,11 +99,11 @@ int main(int argc, char* argv[]) { } else if (access_ptr) { QTime time_stamp = QTime::currentTime(); - lib_parse::VisitorControl control; + lib_parse::VisitEntry control; auto visitor = make_shared(source_dir); - control.visitWith(access_ptr, visitor);; + control.visitWith(access_ptr, visitor); auto dom_result = visitor->content(); - QFile file(destination_dir.absoluteFilePath(u8"storyline.xast")); + QFile file(destination_dir.absoluteFilePath("storyline.xast")); if (file.open(QIODevice::Text | QIODevice::WriteOnly)) { QTextStream tout(&file); tout.setCodec("UTF-8"); @@ -111,8 +111,8 @@ int main(int argc, char* argv[]) { tout.flush(); } auto current_stamp = QTime::currentTime(); - qDebug().noquote() << QString(u8"%AST构建消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp)); - qDebug().noquote() << QString(u8"%编译成功:%1。").arg(QFileInfo(file).absoluteFilePath()); + qDebug().noquote() << QString("%AST鏋勫缓娑堣楁椂闂达細%1 ms銆").arg(time_stamp.msecsTo(current_stamp)); + qDebug().noquote() << QString("%缂栬瘧鎴愬姛锛%1銆").arg(QFileInfo(file).absoluteFilePath()); } }break; case 0xAu: diff --git a/WsNovelParser/novelparser.cpp b/WsNovelParser/novelparser.cpp index df59d18..2e2e801 100644 --- a/WsNovelParser/novelparser.cpp +++ b/WsNovelParser/novelparser.cpp @@ -9,63 +9,71 @@ using namespace example_novel; using namespace lib_parse; -NovelParser::NovelParser() -{ - this->syntax_defines = NovalSyntax::getSyntaxTree(); - checker_list << std::make_shared(); - checker_list << std::make_shared(); - checker_list << std::make_shared(); +NovelParser::NovelParser() { + checker_list << std::make_shared(); + checker_list << std::make_shared(); + checker_list << std::make_shared(); - analyzer_ref = std::make_shared(checker_list); + analyzer_ref = std::make_shared(checker_list); } -QList> NovelParser::fragmentsSorted() const -{ - return std::dynamic_pointer_cast(checker_list[1])->fragmentsSequence(); +QList> NovelParser::fragmentsSorted() const { + return std::dynamic_pointer_cast(checker_list[1])->pointsSequence(); } -QString NovelParser::version() const -{ - return "1.0.0"; +QString NovelParser::version() const { + return "1.0.0"; } -std::shared_ptr NovelParser::parserContext() const -{ - return context; +std::shared_ptr NovelParser::parserContext() const { + return context; } -QList> NovelParser::parse(const QFileInfoList source_list) const { - const_cast(this)->context = std::make_shared(u8"小说"); - auto word_reader = std::make_shared(); +std::shared_ptr NovelParser::parse(const QFileInfoList source_list) const { + const_cast(this)->context = std::make_shared("灏忚"); - auto time_stamp = QTime::currentTime(); - for (auto& file : source_list) { - context->setCurrentFile(file.canonicalFilePath()); - auto words = word_reader->wordsFrom(file.canonicalFilePath()); - this->syntax_defines->parse(context, words); - } + auto time_stamp = QTime::currentTime(); + for (auto finfo : source_list) { + // 杞藉叆鎸囧畾鏂囦欢鍐呭 + QFile file_target(finfo.absoluteFilePath()); + if (!file_target.open(QIODevice::ReadOnly | QIODevice::Text)) { + throw new lib_parse::CheckException(QString("DeviceError[0x00001]鎸囧畾鏂囦欢鏃犳硶鎵撳紑:%1銆").arg(finfo.absoluteFilePath())); + } + QTextStream intext(&file_target); + intext.setCodec("UTF-8"); + auto word_reader = std::make_shared(); + auto word_head = word_reader->wordsFrom(intext, finfo.canonicalFilePath()); - QList> forst_root = context->getDocInsts(); - auto current_stamp = QTime::currentTime(); - qDebug().noquote() << QString(u8"%词法解析+语法解析消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp)); + // 鏂囦欢璇硶瑙f瀽 + ast_gen::SyntaxParser proc(example_novel::NovalSyntax::getSyntaxTree()); + auto rst = proc.parse(word_head); - return forst_root; + if (rst.first()->totalErrorCount()) { + auto pos_mark = rst.first()->token()->position(); + for (auto item : rst) + if (item->token()->position() == pos_mark) + const_cast(this)->context->appendError(item->totalErrors()); + break; + } + else { + proc.getAst(rst.first(), const_cast(this)->context); + } + } + + auto current_stamp = QTime::currentTime(); + qDebug().noquote() << QString("%璇嶆硶瑙f瀽+璇硶瑙f瀽娑堣楁椂闂达細%1 ms銆").arg(time_stamp.msecsTo(current_stamp)); + + return this->context; } -std::shared_ptr NovelParser::validsApply(QList> forst_root) const { - auto time_stamp = QTime::currentTime(); - QList> docs_node; - for (auto& it : forst_root) { - auto xitem = std::dynamic_pointer_cast(it); - docs_node.append(std::const_pointer_cast(xitem)); - context->addChild(docs_node.last()); - } +std::shared_ptr NovelParser::validsApply(std::shared_ptr ast_root) const { + auto time_stamp = QTime::currentTime(); - auto x_root = NovalSyntax::tidy(context, docs_node); - auto novel_accesstree = std::make_shared(x_root); - auto current_stamp = QTime::currentTime(); - qDebug().noquote() << QString(u8"%程序结构重建消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp)); + auto access_root = std::make_shared(ast_root); + auto results = analyzer_ref->validCheckWith(access_root); - return analyzer_ref->validCheckWith(novel_accesstree); + auto current_stamp = QTime::currentTime(); + qDebug().noquote() << QString("%绋嬪簭鏍¢獙娑堣楁椂闂达細%1 ms銆").arg(time_stamp.msecsTo(current_stamp)); + return results; } diff --git a/WsNovelParser/novelparser.h b/WsNovelParser/novelparser.h index ed41c61..d382e8d 100644 --- a/WsNovelParser/novelparser.h +++ b/WsNovelParser/novelparser.h @@ -6,23 +6,26 @@ #include namespace example_novel { - class FragmentGraphHelper; + class PointGraphHelper; + class NGlobalElement; } +/** + * @brief 闆嗘垚缂栬瘧鍣. + */ class NovelParser { private: - std::shared_ptr context = nullptr; - std::shared_ptr syntax_defines; + std::shared_ptr context = nullptr; QList> checker_list; std::shared_ptr analyzer_ref; public: NovelParser(); - QList> fragmentsSorted() const; + QList> fragmentsSorted() const; virtual QString version() const; - std::shared_ptr parserContext() const; - QList> parse(const QFileInfoList souurce_list) const; - std::shared_ptr validsApply(QList> docs_list) const; + std::shared_ptr parserContext() const; + std::shared_ptr parse(const QFileInfoList souurce_list) const; + std::shared_ptr validsApply(std::shared_ptr root) const; }; \ No newline at end of file diff --git a/libParse/parse_novel.cpp b/libParse/parse_novel.cpp index bd2e007..c6823b7 100644 --- a/libParse/parse_novel.cpp +++ b/libParse/parse_novel.cpp @@ -53,6 +53,10 @@ void FragmentExistsCheck::exists_check(std::shared_ptr root, std: } } +example_novel::FragmentExistsCheck::FragmentExistsCheck() + :_nodes_cache(std::make_shared()) { +} + void FragmentExistsCheck::validCheck(std::shared_ptr root) const { const_cast(this)->nodes_regist(this->_nodes_cache, root); this->exists_check(this->_nodes_cache, root); @@ -62,7 +66,7 @@ QString FragmentExistsCheck::name() const { return "鎯呰妭寮曠敤鏈夋晥鎬ф鏌ュ櫒"; } -QList> FragmentGraphCheck::refers_cycle_check( +QList> PointGraphCheck::refers_cycle_check( std::shared_ptr item, QList> prevs) const { if (prevs.contains(item)) { return prevs << item; @@ -81,19 +85,19 @@ QList> FragmentGraphCheck::refers_cycle_check( return QList>(); } -void FragmentGraphCheck::setElement(std::shared_ptr inst) { +void PointGraphCheck::setElement(std::shared_ptr inst) { elements_store[inst->nodePeer()->signature()] = inst; } -QList> FragmentGraphCheck::fragmentsSequence() const { +QList> PointGraphCheck::pointsSequence() const { return fragments_sort_list; } -std::shared_ptr FragmentGraphCheck::getElement(const QString& signature) const { +std::shared_ptr PointGraphCheck::getElement(const QString& signature) const { return elements_store[signature]; } -QList> FragmentGraphCheck::getHangoutNodes() { +QList> PointGraphCheck::getHangoutNodes() { QList> values; for (auto node_item : elements_store) { @@ -109,7 +113,7 @@ QList> FragmentGraphCheck::getHangoutNodes() { return values; } -bool FragmentGraphCheck::nodeDismantle(std::shared_ptr inst) { +bool PointGraphCheck::nodeDismantle(std::shared_ptr inst) { bool flag = false; for (auto item : inst->nextList()) { @@ -120,9 +124,9 @@ bool FragmentGraphCheck::nodeDismantle(std::shared_ptr inst) { return flag; } -void FragmentGraphCheck::validCheck(std::shared_ptr root) const { - const_cast(this)->fragments_sort_list.clear(); - auto self = std::const_pointer_cast(this->shared_from_this()); +void PointGraphCheck::validCheck(std::shared_ptr root) const { + const_cast(this)->fragments_sort_list.clear(); + auto self = std::const_pointer_cast(this->shared_from_this()); std::function>(std::shared_ptr)> story_peak = [&](std::shared_ptr root)->QList> { @@ -163,7 +167,7 @@ void FragmentGraphCheck::validCheck(std::shared_ptr root) c return return_temp; }; - + // 鑾峰彇鎵鏈夋晠浜嬬嚎 auto all_story = story_peak(root); @@ -257,10 +261,10 @@ void FragmentGraphCheck::validCheck(std::shared_ptr root) c } for (auto& inst : values) - const_cast(this)->fragments_sort_list.append(inst); + const_cast(this)->fragments_sort_list.append(inst); } -QString FragmentGraphCheck::name() const { +QString PointGraphCheck::name() const { return "鎯呰妭缃戠粶鏈夋晥鎬ф鏌ュ櫒"; } diff --git a/libParse/parse_novel.h b/libParse/parse_novel.h index b831063..c5d8f45 100644 --- a/libParse/parse_novel.h +++ b/libParse/parse_novel.h @@ -39,6 +39,8 @@ namespace example_novel { void exists_check(std::shared_ptr cache, std::shared_ptr target) const; public: + FragmentExistsCheck(); + // 閫氳繃 CheckProvider 缁ф壙 virtual QString name() const override; virtual void validCheck(std::shared_ptr root) const override; @@ -47,7 +49,7 @@ namespace example_novel { /** * @brief 鎯呰妭鑺傜偣鏍¢獙. */ - class LIBPARSE_EXPORT FragmentGraphCheck : public lib_parse::CheckProvider, public std::enable_shared_from_this { + class LIBPARSE_EXPORT PointGraphCheck : public lib_parse::CheckProvider, public std::enable_shared_from_this { private: QHash> elements_store; QList> fragments_sort_list; @@ -62,7 +64,7 @@ namespace example_novel { QList> getHangoutNodes(); bool nodeDismantle(std::shared_ptr inst); - QList> fragmentsSequence() const; + QList> pointsSequence() const; // CheckProvider interface public: diff --git a/libSyntax/ast_basic.cpp b/libSyntax/ast_basic.cpp index 75c0db6..a9200f4 100644 --- a/libSyntax/ast_basic.cpp +++ b/libSyntax/ast_basic.cpp @@ -28,9 +28,18 @@ QList> ExprInstance::children() const { } void ExprInstance::addChild(std::shared_ptr inst) { + std::const_pointer_cast(inst)->setParent(shared_from_this()); this->children_store.append(inst); } +void ast_basic::ExprInstance::setParent(std::weak_ptr pinst) { + this->_parent_bind = pinst; +} + +std::weak_ptr ast_basic::ExprInstance::parentExpr() const { + return this->_parent_bind; +} + QList> ExprInstance::tokens() const { return this->tokens_bind; } @@ -56,5 +65,12 @@ QList> ExprProgram::children() const { } void ExprProgram::addChild(std::shared_ptr inst) { + std::const_pointer_cast(inst)->setParent(shared_from_this()); _children_store.append(inst); } + +void ast_basic::ExprProgram::setParent(std::weak_ptr pinst) { } + +std::weak_ptr ast_basic::ExprProgram::parentExpr() const { + return std::weak_ptr(); +} diff --git a/libSyntax/ast_basic.h b/libSyntax/ast_basic.h index cce8015..2920514 100644 --- a/libSyntax/ast_basic.h +++ b/libSyntax/ast_basic.h @@ -52,6 +52,13 @@ namespace ast_basic { * \param inst 瀛愯〃杈惧紡瀹炰緥 */ virtual void addChild(std::shared_ptr inst) = 0; + /** + * @brief 璁剧疆鐖惰〃杈惧紡. + * + * \param pinst + */ + virtual void setParent(std::weak_ptr pinst) = 0; + virtual std::weak_ptr parentExpr() const = 0; }; @@ -61,6 +68,8 @@ namespace ast_basic { */ class LIBSYNTAX_EXPORT ExprInstance : public IExprInstance, public std::enable_shared_from_this { private: + std::weak_ptr _parent_bind; + std::shared_ptr _expr_rule; QList> children_store; QList> tokens_bind; @@ -77,6 +86,9 @@ namespace ast_basic { QList> children() const override; void addChild(std::shared_ptr inst) override; + + virtual void setParent(std::weak_ptr pinst) override; + virtual std::weak_ptr parentExpr() const override; }; /** @@ -97,5 +109,7 @@ namespace ast_basic { void addToken(std::shared_ptr token_inst) override; QList> children() const override; void addChild(std::shared_ptr inst) override; + void setParent(std::weak_ptr pinst) override; + std::weak_ptr parentExpr() const override; }; } \ No newline at end of file diff --git a/libSyntax/ast_novel.cpp b/libSyntax/ast_novel.cpp index 46b8c9e..ab4a1aa 100644 --- a/libSyntax/ast_novel.cpp +++ b/libSyntax/ast_novel.cpp @@ -34,11 +34,11 @@ void PointRefers::setStoryRefer(const QString& refer) { } QString PointRefers::sliceRefer() const { - return story_refs; + return slice_ref; } void PointRefers::setSliceRefer(const QString& refer) { - story_refs = refer; + slice_ref = refer; } QString PointRefers::pointRefer() const { @@ -192,14 +192,19 @@ std::weak_ptr NGlobalElement::parent() const { return std::weak_ptr(); } -void NGlobalElement::setParent(std::shared_ptr inst) { } - QList> NGlobalElement::selfTokens() const { return QList>(); } NGlobalElement::NGlobalElement(const QString& root): ExprProgram(root) { } +void example_novel::NGlobalElement::appendError(const QList& errors) { + _errors_store.append(errors); +} + +QList example_novel::NGlobalElement::errors() const { + return _errors_store; +} using namespace ast_gen; diff --git a/libSyntax/ast_novel.h b/libSyntax/ast_novel.h index 267c046..ab733f6 100644 --- a/libSyntax/ast_novel.h +++ b/libSyntax/ast_novel.h @@ -51,12 +51,6 @@ namespace ast_gen { * @return 鏈缃畃arent锛岃繑鍥瀗ullptr */ virtual std::weak_ptr parent() const = 0; - /** - * @brief 閲嶇疆鐖舵寚閽. - * - * \param inst - */ - virtual void setParent(std::shared_ptr inst) = 0; /** * @brief 瀹氫箟鍏冪礌鑷韩鐨凾oken闆嗗悎 @@ -160,10 +154,7 @@ namespace example_novel { return ExprInstance::filePath(); } virtual std::weak_ptr parent() const override { - return this->parent_store; - } - virtual void setParent(std::shared_ptr inst) override { - this->parent_store = inst; + return std::dynamic_pointer_cast(ExprInstance::parentExpr().lock()); } virtual QList> selfTokens() const override { auto tokensx = ExprInstance::tokens(); @@ -337,8 +328,14 @@ namespace example_novel { * @brief 鍏ㄥ眬鏍瑰厓绱 */ class LIBSYNTAX_EXPORT NGlobalElement : public ast_basic::ExprProgram, public ast_gen::SyntaxElement { + private: + QList _errors_store; + public: - NGlobalElement(const QString &root); + NGlobalElement(const QString& root); + + void appendError(const QList& errors); + QList errors() const; // 閫氳繃 SyntaxElement 缁ф壙 std::shared_ptr bindExpression() const override; @@ -347,7 +344,6 @@ namespace example_novel { QString path() const override; QString signature() const override; std::weak_ptr parent() const override; - void setParent(std::shared_ptr inst) override; QList> selfTokens() const override; }; }