QtNovelUI/libParse/StoryUnitDocumentParser.h

193 lines
4.7 KiB
C++

#pragma once
#include "XSyntaxBase.h"
#include "ParseFrame.h"
#include "SyntaxBase.h"
namespace Parse {
/**
* 故事单元.
*/
class NodeStoryUnit : public Result::NamedNode
{
public:
explicit NodeStoryUnit(Result::DocCore *doc, const QString &name);
virtual ~NodeStoryUnit() = default;
// 通过 DesNode 继承
virtual bool check(QList<ErrorMessage>& reasons) const override;
virtual QString toString() const override;
};
/** 故事单元解析器 */
class NodeStoryUnitParser : public Syntax::XSyntaxBase
{
public:
NodeStoryUnitParser(Result::ParseCore *core);
Result::ParseCore* project() const;
private:
Result::ParseCore *const pjt_core;
};
/**
* 故事情节节点.
*/
class NodeStoryFragment : public Result::NamedNode
{
public:
explicit NodeStoryFragment(NodeStoryUnit* unit, const QString &name, const QString& order);
virtual ~NodeStoryFragment() = default;
QString order() const;
double orderValue(bool &isvalid) const;
// 通过 NamedNode 继承
virtual bool check(QList<ErrorMessage>& reasons) const override;
virtual QString toString() const override;
virtual QList<QString> name() const override;
private:
QString store_name;
QString order_text;
};
/**
* 故事情节解析器.
*/
class NodeStoryFragmentParser : public Syntax::XSyntaxBase
{
public:
NodeStoryFragmentParser(NodeStoryUnitParser *pparser);
NodeStoryUnitParser * nodeStoryUnitParser() const;
Result::DocCore * docRef() const;
private:
NodeStoryUnitParser *const parent_parser;
};
/**
* 故事脉络节点引用.
*/
class NodeStoryPointRefer : public Result::DesNode
{
public:
explicit NodeStoryPointRefer(DesNode *parent, const QString &chain, const QString &point);
virtual ~NodeStoryPointRefer() = default;
QString chainName() const;
QString pointName() const;
// 通过 DesNode 继承
virtual bool check(QList<ErrorMessage>& reasons) const override;
virtual QString toString() const override;
private:
QString chain_name;
QString point_name;
};
/**
* @brief 特殊用途的解析器,目标是移除指定标记的
*/
class NodeStoryLinePrefixParser : public Syntax::XSyntaxBase
{
public:
NodeStoryLinePrefixParser(SyntaxParser* pparent);
void setMatchEnable(bool v);
private:
Syntax::ParseRule *critical_rule;
};
class NodeStoryMixedDesGroupParser : public Syntax::XSyntaxBase
{
public:
NodeStoryMixedDesGroupParser(Syntax::XSyntaxBase * parent);
virtual void reset() override;
private:
Syntax::XSyntaxBase *const parent_parser;
NodeStoryLinePrefixParser *const unique_tidy;
};
class NodeStoryTextSpanParser : public Syntax::XSyntaxBase
{
public:
NodeStoryTextSpanParser(Syntax::XSyntaxBase *parent);
private:
Syntax::XSyntaxBase *const parent_parser;
};
class NodeStoryPointReferParser : public Syntax::XSyntaxBase
{
public:
NodeStoryPointReferParser(Syntax::XSyntaxBase *parent);
private:
Syntax::XSyntaxBase *const parent_parser;
};
// /**
// * 故事情节有序注释,单独解析
// * #注解 注解名 序列名 值 {
// * 注解段落
// * 注解段落
// * }
// */
// class NodeStoryFragmentComment : public Result::NamedNode
// {
// public:
// NodeStoryFragmentComment(DesNode *parent, const QString &order, const QString &name);
// virtual ~NodeStoryFragmentComment() = default;
// QString order() const;
// // 通过 NamedNode 继承
// inline virtual int depth() const override
// {
// return parent_ins->depth() + 1;
// }
// virtual Result::DocCore * document() const override;
// virtual int typeValue() const override;
// virtual DesNode * parent() const override;
// virtual void appendChild(DesNode * ins) override;
// virtual QList<DesNode*> children() const override;
// virtual bool check(QList<QString>& reasons) const override;
// virtual QString toString() const override;
// virtual QString name() const override;
// QString orderValue() const;
// void resetValue(const QString &value);
// private:
// DesNode *const parent_ins;
// QString name_store;
// QString order_name;
// QString order_value;
// QList<DesNode*> children_nodes;
// };
// class NodeStoryFragmentCommentParser : public Syntax::XSyntaxBase
// {
// public:
// NodeStoryFragmentCommentParser(Syntax::SyntaxParser* pparser);
// private:
// Syntax::SyntaxParser *const pparser;
// };
class StoryUnitDocumentParser : public Syntax::ParseFrame
{
public:
StoryUnitDocumentParser(Result::ParseCore *ins);
};
}