#ifndef LIBPARSE_H #define LIBPARSE_H #include "libParse_global.h" #include "ComnDef.h" #include #include #include namespace Parse { struct ErrorMessage { QString Reason; QString Text; QString FilePath; int CodeRow; int CodeCol; }; namespace Result { class ParseCore; class DocCore; class DesNode; enum class DocType { STORYBOARD = DOC_STORYBOARD, STORYUNIT = DOC_STORYUNIT, STORYCHAIN = DOC_STORYCHAIN, STORYOUTLINES = DOC_VOLUMEOUTLINE }; /** * 词语块,可以通过文档未知直接获取. */ 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 children() const; /** * @brief 注册引用本节点的词语 * @param ins */ void registerWords(Words *ins); /** * @brief 获取所有引用本节点的词语 * @return */ QList refered() const; /** * 检查项目错误. * * \return true,没有错误 */ virtual bool check(QList &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 children_nodes; QList 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 名称字符串 */ QString name() const; private: QString name_store; }; /** * 文档实例专用于文档高亮渲染和语法补全. */ class LIBPARSE_EXPORT DocCore { public: explicit DocCore(ParseCore* core, DocType type, const QFileInfo &path); virtual ~DocCore() = default; /** * 无法识别的节点归并. * * \return */ Result::DesNode* unknowns() const; /** * 项目实例. * * \return */ ParseCore* core() const; /** * @brief 文档类型 * @return */ DocType docType() const; /** * 源文件路径. * * \return */ QString filePath() const; /** * 文件名. * * \return */ QString fileName() const; /** * 清除所有的词语节点和内容节点. */ void clear(); /** * 对文档实例添加节点实例. * * \param ins 节点实例 * \return 0 - 添加成功 */ int append(Words *ins); /** * 通过位置获取词语. * * \param row 行位置 * \param col 列位置 * \return 字符号 */ QList getWords(int row, int col=-1) const; private: Result::DesNode *const unknown_host; ParseCore *const core_store; QString file_path_store; DocType type_store; QList words_store; }; /** * 解析实例核心. */ class LIBPARSE_EXPORT ParseCore { private: QHash*> 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 allDocuments() const; virtual QList 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 allStoryChains() const; virtual QList queryStoryChain(const QString & name) const; virtual QList queryStoryPoint(Result::DesNode* chain, const QString &name) const; virtual QList queryStoryUnit(const QString &name) const; virtual QList queryStoryFragment(Result::DesNode *unit, const QString &name) const; virtual QList queryStoryBoard(const QString &name) const; /** * @brief 获取卷宗大纲叙述节点 * @param name * @return */ virtual QList queryStoryDepiction(const QString &name) const; }; } } #endif // LIBPARSE_H