• Main Page
  • Classes
  • Files
  • File List
  • File Members

lib/bfTemplateEngine/src/template.cpp

Go to the documentation of this file.
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     // search for if-else-end
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) { // there is an else part
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 { // value==false
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) { // and no else part
00067                 QString truePart=mid(start+startTag.length(), end-start-startTag.length());
00068                 replace(start, end-start+endTag.length(), truePart);
00069             }
00070             else { // value==false and no else part
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     // search for ifnot-else-end
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) { // there is an else part
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 { // value==true
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) { // and no else part
00098                 QString falsePart=mid(start+startTag2.length(), end-start-startTag2.length());
00099                 replace(start, end-start+endTag.length(), falsePart);
00100             }
00101             else { // value==true and no else part
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     // search for loop-else-end
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) { // there is an else part
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                         // number variables, conditions and sub-loop within the loop
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 { // repetitions==0
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) { // and no else part
00153                 QString loopPart=mid(start+startTag.length(), end-start-startTag.length());
00154                 QString insertMe;
00155                 for (int i=0; i<repetitions; ++i) {
00156                     // number variables, conditions and sub-loop within the loop
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 { // repetitions==0 and no else part
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 

Generated on Mon Dec 26 2011 12:09:22 for QtWebApp by  doxygen 1.7.1