QtNovelUI/libParse/libParse.h

347 lines
9.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef LIBPARSE_H
#define LIBPARSE_H
#include "libParse_global.h"
#include "ComnDef.h"
#include <QFileInfo>
#include <QList>
#include <QString>
namespace Parse
{
namespace Result
{
class DesNode;
}
class ErrorMessage
{
public:
ErrorMessage(const Result::DesNode *obj);
QString Reason;
QString Text;
QString FilePath;
int CodeRow;
int CodeCol;
const Result::DesNode *const object;
};
namespace Result{
class ParseCore;
class DocCore;
enum class DocType
{
STORYBOARD = DOC_STORYBOARD,
STORYUNIT = DOC_STORYUNIT,
STORYCHAIN = DOC_STORYCHAIN,
STORYOUTLINES = DOC_VOLUMEOUTLINE,
STORYCONCEPTS = DOC_STORYCONCEPT
};
/**
* 词语块,可以通过文档未知直接获取.
*/
class LIBPARSE_EXPORT Words
{
public:
explicit Words(Result::DesNode* host, Result::DocCore *doc, const QString &value, int row, int col);
virtual ~Words() = default;
/**
* 起始行位置.
*
* \return
*/
virtual int row() const;
/**
* 起始列位置.
*
* \return
*/
virtual int column() const;
/**
* 此语块长度.
*
* \return 字符数量
*/
virtual int length() const;
/**
* 获取依托节点悬空节点返回nullptr.
*
* \return
*/
virtual Result::DesNode* host() const;
/**
* 隶属文档实例.
*
* \return 实例
*/
virtual Result::DocCore* doc() const;
/**
* 获取文本内容.
*
* \return
*/
virtual QString toString() const;
private:
QString value_store;
int row_store, col_store;
Result::DesNode *desnode_store;
Result::DocCore *docpresent_store;
};
/**
* 描述性的节点,如文本节点和引用节点.
*/
class LIBPARSE_EXPORT DesNode
{
public:
DesNode(DocCore *core, int type_value, DesNode *pnode = nullptr);
virtual ~DesNode();
/**
* 节点树深度根节点深度为0
*
* \return
*/
int depth() const;
/**
* 承载文档源实例.
*
* \return
*/
DocCore* doc() const;
/**
* 类型标记.
*
* \return 标记值
*/
int typeValue() const;
/**
* 获取该节点的父节点.
*
* \return 父节点实例
*/
DesNode* parent() const;
/**
* 添加子节点
*
* \param ins 节点实例
*/
void appendChild(DesNode *ins);
/**
* 获取所有子节点
*
* \return 子节点集合
*/
QList<DesNode*> children() const;
/**
* @brief 注册引用本节点的词语
* @param ins
*/
void registerWords(Words *ins);
/**
* @brief 获取所有引用本节点的词语
* @return
*/
QList<Words*> refered() const;
/**
* 检查项目错误.
*
* \return true没有错误
*/
virtual bool check(QList<ErrorMessage> &reasons) const = 0;
/**
* 返回本节点的代表文本内容.
*
* \return 文本内容
*/
virtual QString toString() const = 0;
protected:
void clear_refers();
private:
DocCore *const doc_store;
int type_value;
DesNode *const parent_node;
QList<DesNode*> children_nodes;
QList<Words*> words_collection;
};
/**
* 声明描述节点.
*/
class LIBPARSE_EXPORT NamedNode : public Result::DesNode
{
public:
NamedNode(const QString &name, DocCore *core, int type, DesNode *pnode = nullptr);
virtual ~NamedNode() = default;
/**
* 获取此节点的名称.
*
* \return 名称字符串
*/
virtual QList<QString> name() const;
private:
QString name_store;
};
/**
* 文档实例专用于文档高亮渲染和语法补全.
*/
class LIBPARSE_EXPORT DocCore
{
public:
explicit DocCore(ParseCore* core, DocType type, const QFileInfo &path, const QString &doc_name);
virtual ~DocCore() = default;
/**
* 无法识别的节点归并.
*
* \return
*/
Result::DesNode* unknowns() const;
/**
* 项目实例.
*
* \return
*/
ParseCore* core() const;
/**
* @brief 文档类型
* @return
*/
DocType docType() const;
/**
* 源文件路径.
*
* \return
*/
QString filePath() const;
/**
* 文件名.
*
* \return
*/
QString docName() const;
/**
* 清除所有的词语节点和内容节点.
*/
void clear();
/**
* 对文档实例添加节点实例.
*
* \param ins 节点实例
* \return 0 - 添加成功
*/
int append(Words *ins);
/**
* 通过位置获取词语.
*
* \param row 行位置
* \param col 列位置
* \return 字符号
*/
QList<Words *> getWords(int row, int col=-1) const;
private:
Result::DesNode *const unknown_host;
ParseCore *const core_store;
QString doc_name;
QString file_path_store;
DocType type_store;
QList<Words*> words_store;
};
/**
* 解析实例核心.
*/
class LIBPARSE_EXPORT ParseCore
{
private:
QHash<DocCore*, QList<DesNode*>*> nodes_map;
public:
explicit ParseCore();
virtual ~ParseCore() = default;
virtual void registerDoc(DocCore *ins);
virtual void registerNode(DocCore *doc, DesNode *node);
virtual void clearNodes(DocCore *ins);
virtual QList<DocCore *> allDocuments() const;
virtual QList<DesNode*> queryRootNodes(DocCore *doc) const;
/**
* 获取文档内存实例如果不存在指定实例返回nullptr.
*
* \param file_path 文档路径
* \return 实例
*/
virtual Result::DocCore* queryDocument(const QFileInfo &file_src) const;
virtual void deleteDocument(Result::DocCore *ins);
virtual QList<Result::DesNode*> allStoryChains() const;
virtual QList<Result::DesNode*> queryStoryChain(const QString & name) const;
virtual QList<Result::DesNode*> queryStoryPoint(Result::DesNode* chain, const QString &name) const;
virtual QList<Result::DesNode*> allStoryUnits() const;
virtual QList<Result::DesNode*> queryStoryUnit(const QString &name) const;
virtual QList<Result::DesNode*> queryStoryFragment(Result::DesNode *unit, const QString &name) const;
virtual QList<std::pair<Result::NamedNode*, double>> queryOrdersFragment() const;
virtual QList<Result::DesNode*> allStoryBoards() const;
virtual QList<Result::DesNode*> queryStoryBoard(const QString &name) const;
virtual QList<Result::DesNode*> queryStoryFragmentRefer(Result::DesNode *unit, const QString &name) const;
virtual QList<Result::DesNode*> allStoryConcept() const;
virtual QList<Result::DesNode*> queryStoryConcept(const QString &name) const;
virtual QList<Result::DesNode*> queryStoryStrongPoint(Result::DesNode *concept, const QString &name) const;
/**
* @brief 获取卷宗大纲叙述节点
* @param name
* @return
*/
virtual QList<Result::DesNode*> queryStoryDepiction(const QString &name) const;
};
}
}
#endif // LIBPARSE_H