WsParser_VS/libToken/tokens_novel.cpp

214 lines
6.7 KiB
C++
Raw Normal View History

2024-03-17 07:58:28 +00:00
#include "tokens_novel.h"
using namespace example_novel;
2024-06-18 13:17:06 +00:00
using namespace lib_token;
2024-03-17 07:58:28 +00:00
2024-06-20 04:49:26 +00:00
TokenContent::TokenContent(int r, int c, const QString& t, const QString& p, std::shared_ptr<const ITokenDefine> type)
: row_n(r), col_n(c), text_n(t), path_p(p), type_def(type) {}
QString TokenContent::file() const { return path_p; }
QString TokenContent::content() const { return text_n; }
int TokenContent::row() const { return row_n; }
int TokenContent::column() const { return col_n; }
std::shared_ptr<const IWordBase> lib_token::TokenContent::nextWord() const
{
return nullptr;
}
std::shared_ptr<const ITokenDefine> TokenContent::define() const { return this->type_def; }
2024-06-19 04:05:43 +00:00
QString LeftBracket::typeName() const { return u8"left-bracket"; }
int example_novel::LeftBracket::typeMark() const
{
return 0x01000000;
}
2024-03-17 07:58:28 +00:00
QString LeftBracket::regex() const { return u8"{"; }
2024-06-20 04:49:26 +00:00
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase>>
LeftBracket::analysis(std::shared_ptr<const IWordBase> content) const {
2024-03-17 07:58:28 +00:00
auto text = content->content();
if (!text.startsWith(regex()))
return std::make_tuple(nullptr, content);
2024-06-18 13:17:06 +00:00
auto token_inst = std::make_shared<TokenContent>(content->row(), content->column(), content->content().mid(0, regex().length()),
2024-03-17 07:58:28 +00:00
content->file(), shared_from_this());
auto t_remains = content->content().mid(regex().length());
if (t_remains.length() > 0) {
2024-06-20 04:49:26 +00:00
auto remains = std::make_shared<WordContent>(content->row(), content->column() + regex().length(), t_remains, content->file());
2024-03-17 07:58:28 +00:00
return std::make_tuple(token_inst, remains);
}
return std::make_tuple(token_inst, nullptr);
}
2024-06-19 04:05:43 +00:00
QString RightBracket::typeName() const { return u8"right-bracket"; }
int example_novel::RightBracket::typeMark() const
{
return 0x02000000;
}
2024-03-17 07:58:28 +00:00
QString RightBracket::regex() const { return u8"}"; }
2024-06-19 04:05:43 +00:00
QString ReferMark::typeName() const { return u8"refer-mark"; }
int example_novel::ReferMark::typeMark() const
{
return 0x03000000;
}
2024-03-17 07:58:28 +00:00
QString ReferMark::regex() const { return u8"@"; }
2024-06-19 04:05:43 +00:00
Keywords::Keywords(const QString& val, const QString& nm, uint type_code) : value_store(val), name_store(nm), type_code(type_code) {}
2024-03-17 07:58:28 +00:00
2024-06-19 04:05:43 +00:00
QString Keywords::typeName() const { return name_store; }
int example_novel::Keywords::typeMark() const
{
return 0x06000000 | (0x00ffffff & type_code);
}
2024-03-17 07:58:28 +00:00
QString Keywords::regex() const { return value_store; }
2024-06-20 04:49:26 +00:00
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase>>
Keywords::analysis(std::shared_ptr<const IWordBase> content) const {
2024-03-17 07:58:28 +00:00
if (content->content() != regex()) {
return std::make_tuple(nullptr, content);
}
2024-06-18 13:17:06 +00:00
auto token_inst = std::make_shared<TokenContent>(content->row(), content->column(), content->content(), content->file(), shared_from_this());
2024-03-17 07:58:28 +00:00
return std::make_tuple(token_inst, nullptr);
}
2024-06-19 04:05:43 +00:00
QString NewLine::typeName() const { return u8"new-line"; }
int example_novel::NewLine::typeMark() const
{
return 0x04000000;
}
2024-03-17 07:58:28 +00:00
QString NewLine::regex() const { return u8"\n"; }
2024-06-19 04:05:43 +00:00
QString Numbers::typeName() const { return u8"numbers"; }
int example_novel::Numbers::typeMark() const
{
return 0x07000000;
}
2024-03-17 07:58:28 +00:00
QString Numbers::regex() const { return u8"^([0-9]+)$"; }
2024-06-20 04:49:26 +00:00
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase>>
Numbers::analysis(std::shared_ptr<const IWordBase> content) const {
2024-03-17 07:58:28 +00:00
auto text = content->content();
QRegExp regx(regex());
if (regx.indexIn(text) == -1)
return std::make_tuple(nullptr, content);
2024-06-18 13:17:06 +00:00
auto tinst = std::make_shared<TokenContent>(content->row(), content->column(), content->content(), content->file(), shared_from_this());
2024-03-17 07:58:28 +00:00
return std::make_tuple(tinst, nullptr);
}
2024-06-19 04:05:43 +00:00
QString VTextSection::typeName() const { return u8"text-section"; }
int example_novel::VTextSection::typeMark() const
{
return 0x09000000;
}
2024-03-17 07:58:28 +00:00
QString VTextSection::regex() const { return u8"^([^\\{\\}\\n@&]+)"; }
2024-06-20 04:49:26 +00:00
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase>>
VTextSection::analysis(std::shared_ptr<const IWordBase> content) const {
2024-03-17 07:58:28 +00:00
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());
2024-06-18 13:17:06 +00:00
auto tinst = std::make_shared<TokenContent>(content->row(), content->column(), match, content->file(), shared_from_this());
2024-03-17 07:58:28 +00:00
if (remains.length()) {
2024-06-20 04:49:26 +00:00
auto t_remains = std::make_shared<WordContent>(content->row(), content->column(), remains, content->file());
2024-03-17 07:58:28 +00:00
return std::make_tuple(tinst, t_remains);
}
return std::make_tuple(tinst, nullptr);
}
2024-06-19 04:05:43 +00:00
QString Split::typeName() const { return u8"split-mark"; }
int example_novel::Split::typeMark() const
{
return 0x05000000;
}
2024-03-17 07:58:28 +00:00
QString Split::regex() const { return u8"&"; }
2024-06-19 04:05:43 +00:00
QString NameSection::typeName() const { return u8"name-section"; }
int example_novel::NameSection::typeMark() const
{
return 0x08000000;
}
2024-03-17 07:58:28 +00:00
QString NameSection::regex() const { return u8"^([^:\\{\\}\\n@&][^\\{\\}\\n@&]*)"; }
2024-06-20 04:49:26 +00:00
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase> > NameSection::analysis(std::shared_ptr<const IWordBase> content) const
2024-03-17 07:58:28 +00:00
{
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());
2024-06-18 13:17:06 +00:00
auto tinst = std::make_shared<TokenContent>(content->row(), content->column(), match, content->file(), shared_from_this());
2024-03-17 07:58:28 +00:00
if (remains.length()) {
2024-06-20 04:49:26 +00:00
auto t_remains = std::make_shared<WordContent>(content->row(), content->column(), remains, content->file());
return std::make_tuple(tinst, t_remains);
}
return std::make_tuple(tinst, nullptr);
}
QString example_novel::DeclareSymbo::typeName() const
{
return u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
}
int example_novel::DeclareSymbo::typeMark() const
{
return 0x0A000000;
}
QString example_novel::DeclareSymbo::regex() const
{
return u8"#";
}
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase>> example_novel::DeclareSymbo::analysis(std::shared_ptr<const IWordBase> 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<TokenContent>(content->row(), content->column(), u8"#", content->file(), shared_from_this());
if (remains.length()) {
auto t_remains = std::make_shared<WordContent>(content->row(), content->column()+1, remains, content->file());
2024-03-17 07:58:28 +00:00
return std::make_tuple(tinst, t_remains);
}
return std::make_tuple(tinst, nullptr);
}