/** @file @author Stefan Frings */ #ifndef TEMPLATE_H #define TEMPLATE_H #include <QString> #include <QRegExp> #include <QIODevice> #include <QTextCodec> #include <QFile> #include <QString> #include "templateglobal.h" /** Enhanced version of QString for template processing. Templates are usually loaded from files, but may also be loaded from prepared Strings. Example template file: <p><code><pre> Hello {username}, how are you? {if locked} Your account is locked. {else locked} Welcome on our system. {end locked} The following users are on-line: Username Time {loop user} {user.name} {user.time} {end user} </pre></code></p> <p> Example code to fill this template: <p><code><pre> Template t(QFile("test.tpl"),QTextCode::codecForName("UTF-8")); t.setVariable("username", "Stefan"); t.setCondition("locked",false); t.loop("user",2); t.setVariable("user0.name,"Markus"); t.setVariable("user0.time,"8:30"); t.setVariable("user1.name,"Roland"); t.setVariable("user1.time,"8:45"); </pre></code></p> <p> The code example above shows how variable within loops are numbered. Counting starts with 0. Loops can be nested, for example: <p><code><pre> <table> {loop row} <tr> {loop row.column} <td>{row.column.value}</td> {end row.column} </tr> {end row} </table> </pre></code></p> <p> Example code to fill this nested loop with 3 rows and 4 columns: <p><code><pre> t.loop("row",3); t.loop("row0.column",4); t.setVariable("row0.column0.value","a"); t.setVariable("row0.column1.value","b"); t.setVariable("row0.column2.value","c"); t.setVariable("row0.column3.value","d"); t.loop("row1.column",4); t.setVariable("row1.column0.value","e"); t.setVariable("row1.column1.value","f"); t.setVariable("row1.column2.value","g"); t.setVariable("row1.column3.value","h"); t.loop("row2.column",4); t.setVariable("row2.column0.value","i"); t.setVariable("row2.column1.value","j"); t.setVariable("row2.column2.value","k"); t.setVariable("row2.column3.value","l"); </pre></code></p> @see TemplateLoader @see TemplateCache */ class DECLSPEC Template : public QString { public: /** Constructor that reads the template from a string. @param source The template source text @param sourceName Name of the source file, used for logging */ Template(QString source, QString sourceName); /** Constructor that reads the template from a file. Note that this class does not cache template files by itself, so using this constructor is only recommended to be used on local filesystem. @param file File that provides the source text @param textCodec Encoding of the source @see TemplateLoader @see TemplateCache */ Template(QFile& file, QTextCodec* textCodec); /** Replace a variable by the given value. Affects tags with the syntax - {name} After settings the value of a variable, the variable does not exist anymore, it it cannot be changed multiple times. @param name name of the variable @param value new value @return The count of variables that have been processed */ int setVariable(QString name, QString value); /** Set a condition. This affects tags with the syntax - {if name}...{end name} - {if name}...{else name}...{end name} - {ifnot name}...{end name} - {ifnot name}...{else name}...{end name} @param name Name of the condition @param value Value of the condition @return The count of conditions that have been processed */ int setCondition(QString name, bool value); /** Set number of repetitions of a loop. This affects tags with the syntax - {loop name}...{end name} - {loop name}...{else name}...{end name} @param name Name of the loop @param repetitions The number of repetitions @return The number of loops that have been processed */ int loop(QString name, int repetitions); /** Enable warnings for missing tags @param enable Warnings are enabled, if true */ void enableWarnings(bool enable=true); private: /** Name of the source file */ QString sourceName; /** Enables warnings, if true */ bool warnings; }; #endif // TEMPLATE_H