236 lines
6.4 KiB
C++
236 lines
6.4 KiB
C++
#pragma once
|
|
|
|
#include "extract_basic.h"
|
|
#include "convert_basic.h"
|
|
#include <QVariant>
|
|
#include <QList>
|
|
|
|
/// <summary>
|
|
/// 范围字段获取上下文
|
|
/// </summary>
|
|
class ScopeFieldsGetter {
|
|
public:
|
|
/// <summary>
|
|
/// 绑定当前字段
|
|
/// </summary>
|
|
/// <param typeAlias="unique_key"></param>
|
|
/// <returns></returns>
|
|
virtual bool bindCurrent(const QString& unique_key) = 0;
|
|
|
|
/// <summary>
|
|
/// 获取本字段可用字段
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
virtual QHash<QString, DataType> prevFields() const = 0;
|
|
};
|
|
|
|
/// <summary>
|
|
/// 范围字段设置上下文
|
|
/// </summary>
|
|
class ScopeFieldsSetter {
|
|
public:
|
|
/// <summary>
|
|
/// 注册可用字段
|
|
/// </summary>
|
|
/// <param typeAlias="typeAlias"></param>
|
|
/// <param typeAlias="type"></param>
|
|
virtual void setField(const QString& typeAlias, DataType type) = 0;
|
|
|
|
virtual void clear() = 0;
|
|
};
|
|
|
|
// ================================================================
|
|
/// <summary>
|
|
/// 解释环境数据上下文
|
|
/// </summary>
|
|
class DataContext {
|
|
public:
|
|
/// <summary>
|
|
/// 设置本提取器解释数值
|
|
/// </summary>
|
|
/// <param typeAlias="value"></param>
|
|
virtual void append(const QVariant& value) = 0;
|
|
/// <summary>
|
|
/// 通过unique_key获取解释期数据
|
|
/// </summary>
|
|
/// <param typeAlias="unique_key"></param>
|
|
/// <returns></returns>
|
|
virtual QVariant get(const QString& unique_key) const = 0;
|
|
/// <summary>
|
|
/// 关联上下文
|
|
/// </summary>
|
|
/// <param typeAlias="field"></param>
|
|
/// <param typeAlias="inst"></param>
|
|
virtual void setChild(const QString& field, std::shared_ptr<DataContext> inst) = 0;
|
|
/// <summary>
|
|
/// 获取数据序列
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
virtual QList<QVariant> dataSeqs() const = 0;
|
|
};
|
|
|
|
// ==================================================================
|
|
/// <summary>
|
|
/// 尺寸解析器
|
|
/// </summary>
|
|
class SizeProvider : public Serializable {
|
|
public:
|
|
virtual void bindInput(std::shared_ptr<DataContext> inst) = 0;
|
|
|
|
/// <summary>
|
|
/// 解析器名称
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
virtual QString name() const = 0;
|
|
/// <summary>
|
|
/// 获取值,如果该值无法预先计算得知,返回-1
|
|
/// </summary>
|
|
/// <returns>尺寸值</returns>
|
|
virtual int32_t value(const QString& expr) const = 0;
|
|
|
|
virtual void setExpression(const QString& expr) = 0;
|
|
virtual QString expression() const = 0;
|
|
};
|
|
|
|
// ====================================================================
|
|
/// <summary>
|
|
/// 规则匹配器
|
|
/// </summary>
|
|
class RuleMatch : public Serializable {
|
|
public:
|
|
virtual QString matchType() const = 0;
|
|
virtual std::shared_ptr<ExtractUnit> bindRule() const = 0;
|
|
virtual void bindRule(std::shared_ptr<ExtractUnit> rule) = 0;
|
|
virtual bool checkpass(const QByteArray& buffer) const = 0;
|
|
};
|
|
|
|
/// <summary>
|
|
/// 翻译环境核心
|
|
/// </summary>
|
|
class TranslateBasic {
|
|
private:
|
|
QHash<QString, std::shared_ptr<ExtractDelegate>> _basic_extractor_types;
|
|
QHash<QString, std::shared_ptr<ExtractDelegate>> _complex_extractor_types;
|
|
std::shared_ptr<ExtractDelegate> _default_translate_rule = nullptr;
|
|
|
|
QHash<QString, std::shared_ptr<SizeProvider>> _size_provider_types;
|
|
std::shared_ptr<SizeProvider> _default_size_provider = nullptr;
|
|
|
|
QHash<QString, std::shared_ptr<RuleMatch>> _rule_match_types;
|
|
std::shared_ptr<RuleMatch> _default_rule_match = nullptr;
|
|
|
|
QList<std::shared_ptr<ExtractDelegate>> _custom_rule_types;
|
|
|
|
public:
|
|
TranslateBasic();
|
|
|
|
std::shared_ptr<SizeProvider> defaultSizeProvider() const;
|
|
QHash<QString, std::shared_ptr<SizeProvider>> sizeProviderList() const;
|
|
std::shared_ptr<RuleMatch> defaultRuleMatch() const;
|
|
QHash<QString, std::shared_ptr<RuleMatch>> ruleMatchList() const;
|
|
|
|
std::shared_ptr<ExtractDelegate> defaultExtractUnit() const;
|
|
QHash<QString, std::shared_ptr<ExtractDelegate>> basicExtractors() const;
|
|
QHash<QString, std::shared_ptr<ExtractDelegate>> totalExtractors() const;
|
|
|
|
void addDelegate(std::shared_ptr<ExtractDelegate> inst);
|
|
void removeDelegate(const QString& alias);
|
|
void replaceDelegate(const QString &name, std::shared_ptr<ExtractDelegate> inst);
|
|
QList<QString> delegateAlias() const;
|
|
std::shared_ptr<ExtractDelegate> operator[](const QString &name) const;
|
|
};
|
|
|
|
namespace size_provider {
|
|
/// <summary>
|
|
/// 常量数字提供
|
|
/// </summary>
|
|
class ConstNumberProvider : public SizeProvider {
|
|
public:
|
|
struct __Private {
|
|
QString _value_string;
|
|
} _number;
|
|
|
|
public:
|
|
QString name() const override;
|
|
|
|
void bindInput(std::shared_ptr<DataContext> inst) override;
|
|
|
|
int32_t value(const QString& expr) const override;
|
|
void setExpression(const QString& expr) override;
|
|
QString expression() const override;
|
|
|
|
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
|
|
void saveTo(QJsonObject& obj) const override;
|
|
|
|
std::shared_ptr<Serializable> newDefault() const override;
|
|
};
|
|
|
|
|
|
/// <summary>
|
|
/// 解释期数字提供器
|
|
/// </summary>
|
|
class InterpretedNumberPrivider : public SizeProvider {
|
|
public:
|
|
struct __Private {
|
|
QString _field_refer;
|
|
std::shared_ptr<DataContext> _context_inst;
|
|
} _refer;
|
|
|
|
|
|
public:
|
|
QString name() const override;
|
|
|
|
void bindInput(std::shared_ptr<DataContext> inst) override;
|
|
|
|
int32_t value(const QString& expr) const override;
|
|
void setExpression(const QString& expr) override;
|
|
QString expression() const override;
|
|
|
|
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
|
|
void saveTo(QJsonObject& obj) const override;
|
|
|
|
std::shared_ptr<Serializable> newDefault() const override;
|
|
};
|
|
}
|
|
|
|
class ValueAccessContext : public DataContext,
|
|
public std::enable_shared_from_this<ValueAccessContext> {
|
|
public:
|
|
struct __Private {
|
|
QString _current_field = "";
|
|
QVariant _current_value;
|
|
|
|
QList<std::pair<QString, std::shared_ptr<DataContext>>> _children_context;
|
|
} _cascade;
|
|
|
|
|
|
void init(const QString& field, std::shared_ptr<DataContext> parent);
|
|
void setChild(const QString& field, std::shared_ptr<DataContext> inst) override;
|
|
|
|
void append(const QVariant& value) override;
|
|
|
|
QList<QVariant> dataSeqs() const override;
|
|
|
|
public:
|
|
QVariant get(const QString& unique_key) const override;
|
|
};
|
|
|
|
class FieldManagerLayer : public ScopeFieldsSetter, public ScopeFieldsGetter {
|
|
public:
|
|
struct __Private {
|
|
QString _rule_name;
|
|
std::shared_ptr<ScopeFieldsSetter> _parent_setter = nullptr;
|
|
static QList<std::pair<QString, DataType>> _fields_map;
|
|
}_setter;
|
|
|
|
|
|
bool bindCurrent(const QString& unique_key) override;
|
|
QHash<QString, DataType> prevFields() const override;
|
|
void clear() override;
|
|
|
|
public:
|
|
FieldManagerLayer(const QString& self, std::shared_ptr<ScopeFieldsSetter> instp);
|
|
|
|
void setField(const QString& typeAlias, DataType type) override;
|
|
};
|