00001
00006 #include "template.h"
00007 #include <QFileInfo>
00008
00009 Template::Template(QString source, QString sourceName)
00010 : QString(source) {
00011 this->sourceName=sourceName;
00012 this->warnings=false;
00013 }
00014
00015 Template::Template(QFile& file, QTextCodec* textCodec) {
00016 sourceName=QFileInfo(file.fileName()).baseName();
00017 if (!file.isOpen()) {
00018 file.open(QFile::ReadOnly | QFile::Text);
00019 }
00020 QByteArray data=file.readAll();
00021 file.close();
00022 if (data.size()==0 || file.error()) {
00023 qCritical("Template: cannot read from %s, %s",qPrintable(sourceName),qPrintable(file.errorString()));
00024 append(textCodec->toUnicode(data));
00025 }
00026 }
00027
00028
00029 int Template::setVariable(QString name, QString value) {
00030 int count=0;
00031 QString variable="{"+name+"}";
00032 int start=indexOf(variable);
00033 while (start>=0) {
00034 replace(start, variable.length(), value);
00035 count++;
00036 start=indexOf(variable,start+variable.length());
00037 }
00038 if (count==0 && warnings) {
00039 qWarning("Template: missing variable %s in %s",qPrintable(variable),qPrintable(sourceName));
00040 }
00041 return count;
00042 }
00043
00044 int Template::setCondition(QString name, bool value) {
00045 int count=0;
00046 QString startTag=QString("{if %1}").arg(name);
00047 QString elseTag=QString("{else %1}").arg(name);
00048 QString endTag=QString("{end %1}").arg(name);
00049
00050 int start=indexOf(startTag);
00051 while (start>=0) {
00052 int end=indexOf(endTag,start+startTag.length());
00053 if (end>=0) {
00054 count++;
00055 int ellse=indexOf(elseTag,start+startTag.length());
00056 if (ellse>start && ellse<end) {
00057 if (value==true) {
00058 QString truePart=mid(start+startTag.length(), ellse-start-startTag.length());
00059 replace(start, end-start+endTag.length(), truePart);
00060 }
00061 else {
00062 QString falsePart=mid(ellse+elseTag.length(), end-ellse-elseTag.length());
00063 replace(start, end-start+endTag.length(), falsePart);
00064 }
00065 }
00066 else if (value==true) {
00067 QString truePart=mid(start+startTag.length(), end-start-startTag.length());
00068 replace(start, end-start+endTag.length(), truePart);
00069 }
00070 else {
00071 replace(start, end-start+endTag.length(), "");
00072 }
00073 start=indexOf(startTag,start);
00074 }
00075 else {
00076 qWarning("Template: missing condition end %s in %s",qPrintable(endTag),qPrintable(sourceName));
00077 }
00078 }
00079
00080 QString startTag2="{ifnot "+name+"}";
00081 start=indexOf(startTag2);
00082 while (start>=0) {
00083 int end=indexOf(endTag,start+startTag2.length());
00084 if (end>=0) {
00085 count++;
00086 int ellse=indexOf(elseTag,start+startTag2.length());
00087 if (ellse>start && ellse<end) {
00088 if (value==false) {
00089 QString falsePart=mid(start+startTag2.length(), ellse-start-startTag2.length());
00090 replace(start, end-start+endTag.length(), falsePart);
00091 }
00092 else {
00093 QString truePart=mid(ellse+elseTag.length(), end-ellse-elseTag.length());
00094 replace(start, end-start+endTag.length(), truePart);
00095 }
00096 }
00097 else if (value==false) {
00098 QString falsePart=mid(start+startTag2.length(), end-start-startTag2.length());
00099 replace(start, end-start+endTag.length(), falsePart);
00100 }
00101 else {
00102 replace(start, end-start+endTag.length(), "");
00103 }
00104 start=indexOf(startTag2,start);
00105 }
00106 else {
00107 qWarning("Template: missing condition end %s in %s",qPrintable(endTag),qPrintable(sourceName));
00108 }
00109 }
00110 if (count==0 && warnings) {
00111 qWarning("Template: missing condition %s or %s in %s",qPrintable(startTag),qPrintable(startTag2),qPrintable(sourceName));
00112 }
00113 return count;
00114 }
00115
00116 int Template::loop(QString name, int repetitions) {
00117 Q_ASSERT(repetitions>=0);
00118 int count=0;
00119 QString startTag="{loop "+name+"}";
00120 QString elseTag="{else "+name+"}";
00121 QString endTag="{end "+name+"}";
00122
00123 int start=indexOf(startTag);
00124 while (start>=0) {
00125 int end=indexOf(endTag,start+startTag.length());
00126 if (end>=0) {
00127 count++;
00128 int ellse=indexOf(elseTag,start+startTag.length());
00129 if (ellse>start && ellse<end) {
00130 if (repetitions>0) {
00131 QString loopPart=mid(start+startTag.length(), ellse-start-startTag.length());
00132 QString insertMe;
00133 for (int i=0; i<repetitions; ++i) {
00134
00135 QString nameNum=name+QString::number(i);
00136 QString s=loopPart;
00137 s.replace(QString("{%1.").arg(name), QString("{%1.").arg(nameNum));
00138 s.replace(QString("{if %1.").arg(name), QString("{if %1.").arg(nameNum));
00139 s.replace(QString("{ifnot %1.").arg(name), QString("{ifnot %1.").arg(nameNum));
00140 s.replace(QString("{else %1.").arg(name), QString("{else %1.").arg(nameNum));
00141 s.replace(QString("{end %1.").arg(name), QString("{end %1.").arg(nameNum));
00142 s.replace(QString("{loop %1.").arg(name), QString("{loop %1.").arg(nameNum));
00143 insertMe.append(s);
00144 }
00145 replace(start, end-start+endTag.length(), insertMe);
00146 }
00147 else {
00148 QString elsePart=mid(ellse+elseTag.length(), end-ellse-elseTag.length());
00149 replace(start, end-start+endTag.length(), elsePart);
00150 }
00151 }
00152 else if (repetitions>0) {
00153 QString loopPart=mid(start+startTag.length(), end-start-startTag.length());
00154 QString insertMe;
00155 for (int i=0; i<repetitions; ++i) {
00156
00157 QString nameNum=name+QString::number(i);
00158 QString s=loopPart;
00159 s.replace(QString("{%1.").arg(name), QString("{%1.").arg(nameNum));
00160 s.replace(QString("{if %1.").arg(name), QString("{if %1.").arg(nameNum));
00161 s.replace(QString("{ifnot %1.").arg(name), QString("{ifnot %1.").arg(nameNum));
00162 s.replace(QString("{else %1.").arg(name), QString("{else %1.").arg(nameNum));
00163 s.replace(QString("{end %1.").arg(name), QString("{end %1.").arg(nameNum));
00164 s.replace(QString("{loop %1.").arg(name), QString("{loop %1.").arg(nameNum));
00165 insertMe.append(s);
00166 }
00167 replace(start, end-start+endTag.length(), insertMe);
00168 }
00169 else {
00170 replace(start, end-start+endTag.length(), "");
00171 }
00172 start=indexOf(startTag,start);
00173 }
00174 else {
00175 qWarning("Template: missing loop end %s in %s",qPrintable(endTag),qPrintable(sourceName));
00176 }
00177 }
00178 if (count==0 && warnings) {
00179 qWarning("Template: missing loop %s in %s",qPrintable(startTag),qPrintable(sourceName));
00180 }
00181 return count;
00182 }
00183
00184 void Template::enableWarnings(bool enable) {
00185 warnings=enable;
00186 }
00187