// SPDX-License-Identifier: GPL-2.0 #ifndef TEMPLATELAYOUT_H #define TEMPLATELAYOUT_H #include "core/statistics.h" #include "core/equipment.h" #include struct print_options; struct template_options; class QTextStream; void find_all_templates(); void set_bundled_templates_as_read_only(); void copy_bundled_templates(QString src, const QString &dst, QStringList *templateBackupList); enum token_t {LITERAL, FORSTART, FORSTOP, BLOCKSTART, BLOCKSTOP, IFSTART, IFSTOP, PARSERERROR}; struct token { enum token_t type; QString contents; }; extern QList grantlee_templates, grantlee_statistics_templates; class TemplateLayout : public QObject { Q_OBJECT public: TemplateLayout(const print_options &printOptions, const template_options &templateOptions); QString generate(const std::vector &dives); QString generateStatistics(); static QString readTemplate(QString template_name); static void writeTemplate(QString template_name, QString grantlee_template); int numDives; // valid after a call to generate() private: struct State { QList dives; QList years; QMap types; int forloopiterator = -1; const dive * const *currentDive = nullptr; const stats_t * const *currentYear = nullptr; const QString *currentCylinder = nullptr; const cylinder_t * const *currentCylinderObject = nullptr; }; const print_options &printOptions; const template_options &templateOptions; QList lexer(QString input); void parser(QList tokenList, int from, int to, QTextStream &out, State &state); template void parser_for(QList tokenList, int from, int to, QTextStream &out, State &state, const V &data, const T *&act, bool emitProgress); QVariant getValue(QString list, QString property, const State &state); QString translate(QString s, State &state); signals: void progressUpdated(int value); }; #endif