#include "tokens_novel.h" #include #include "tokens_impl.h" using namespace example_novel; using namespace lib_token; using namespace lib_words; QString LBracket::reviseWords() const { return "{"; } int LBracket::typeMark() const { return 0x01000000; } QString LBracket::regex() const { return "{"; } std::tuple, std::shared_ptr> LBracket::analysis(std::shared_ptr content) const { auto text = content->content(); if (!text.startsWith(regex())) return std::make_tuple(nullptr, content); auto token_inst = std::make_shared(content->row(), content->column(), content->position(), content->content().mid(0, regex().length()), content->file(), shared_from_this()); auto t_remains = content->content().mid(regex().length()); if (t_remains.length() > 0) { auto remains = std::make_shared(content->row(), content->column() + regex().length(), t_remains, content->file()); return std::make_tuple(token_inst, remains); } return std::make_tuple(token_inst, nullptr); } QString RBracket::reviseWords() const { return "}"; } int RBracket::typeMark() const { return 0x02000000; } QString RBracket::regex() const { return "}"; } QString ReferMk::reviseWords() const { return "@"; } int ReferMk::typeMark() const { return 0x03000000; } QString ReferMk::regex() const { return "@"; } __keywords::__keywords(const QString& val, uint type_code) : means_store(val), type_code(type_code) { } QString __keywords::reviseWords() const { return means_store; } int __keywords::typeMark() const { return 0x06000000 | (0x00ffffff & type_code); } QString __keywords::regex() const { return means_store; } std::tuple, std::shared_ptr> __keywords::analysis(std::shared_ptr content) const { if (content->content() != regex()) { return std::make_tuple(nullptr, content); } auto token_inst = std::make_shared(content->row(), content->column(), content->position(), content->content(), content->file(), shared_from_this()); return std::make_tuple(token_inst, nullptr); } QString Numbers::reviseWords() const { return "正整数"; } int Numbers::typeMark() const { return 0x07000000; } QString Numbers::regex() const { return "^([0-9]+)$"; } std::tuple, std::shared_ptr> Numbers::analysis(std::shared_ptr content) const { auto text = content->content(); QRegExp regx(regex()); if (regx.indexIn(text) == -1) return std::make_tuple(nullptr, content); auto tinst = std::make_shared(content->row(), content->column(), content->position(), content->content(), content->file(), shared_from_this()); return std::make_tuple(tinst, nullptr); } QString NormalText::reviseWords() const { return "文本"; } int NormalText::typeMark() const { return 0x09000000; } QString NormalText::regex() const { return "^([^\\{\\}@&]+)"; } std::tuple, std::shared_ptr> NormalText::analysis(std::shared_ptr content) const { auto text = content->content(); QRegExp regx(regex()); if (regx.indexIn(text) == -1) { return std::make_tuple(nullptr, content); } auto match = regx.cap(1); auto remains = content->content().mid(match.length()); auto tinst = std::make_shared(content->row(), content->column(), content->position(), match, content->file(), shared_from_this()); if (remains.length()) { auto t_remains = std::make_shared(content->row(), content->column() + match.length(), remains, content->file()); return std::make_tuple(tinst, t_remains); } return std::make_tuple(tinst, nullptr); } QString SplitMk::reviseWords() const { return "&"; } int SplitMk::typeMark() const { return 0x05000000; } QString SplitMk::regex() const { return "&"; } QString NameText::reviseWords() const { return "名称"; } int NameText::typeMark() const { return 0x08000000; } QString NameText::regex() const { return "^([^\\{\\}@&]+)"; } std::tuple, std::shared_ptr > NameText::analysis(std::shared_ptr content) const { auto text = content->content(); QRegExp regx(regex()); if (regx.indexIn(text) == -1) { return std::make_tuple(nullptr, content); } auto match = regx.cap(1); auto remains = content->content().mid(match.length()); auto tinst = std::make_shared(content->row(), content->column(), content->position(), match, content->file(), shared_from_this()); if (remains.length()) { auto t_remains = std::make_shared(content->row(), content->column() + match.length(), remains, content->file()); return std::make_tuple(tinst, t_remains); } return std::make_tuple(tinst, nullptr); } QString DeclareSymbo::reviseWords() const { return "#"; } int DeclareSymbo::typeMark() const { return 0x0A000000; } QString DeclareSymbo::regex() const { return "#"; } std::tuple, std::shared_ptr> DeclareSymbo::analysis(std::shared_ptr content) const { auto text = content->content(); if (content->column() != 1 && !text.startsWith(regex())) { return std::make_tuple(nullptr, content); } auto remains = content->content().mid(regex().size()); auto tinst = std::make_shared(content->row(), content->column(), content->position(), "#", content->file(), shared_from_this()); if (remains.length()) { auto t_remains = std::make_shared(content->row(), content->column() + regex().length(), remains, content->file()); return std::make_tuple(tinst, t_remains); } return std::make_tuple(tinst, nullptr); } inline example_novel::RankWord::RankWord() : __keywords("排序", 0xAEu) { } inline example_novel::StoryWord::StoryWord() : __keywords("故事", 0xAAu) { } inline example_novel::SliceWord::SliceWord() : __keywords("情节", 0xAFu) { } inline example_novel::VolumeWord::VolumeWord() : __keywords("分卷", 0xACu) { } inline example_novel::ArticleWord::ArticleWord() : __keywords("章节", 0xADu) { }