--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) Qxt Foundation. Some rights reserved.
+**
+** This file is part of the QxtWeb module of the Qt eXTension library
+**
+** This library is free software; you can redistribute it and/or modify it
+** under the terms of th Common Public License, version 1.0, as published by
+** IBM.
+**
+** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+** FITNESS FOR A PARTICULAR PURPOSE.
+**
+** You should have received a copy of the CPL along with this file.
+** See the LICENSE file and the cpl1.0.txt file included with the source
+** distribution for more information. If you did not receive a copy of the
+** license, contact the Qxt Foundation.
+**
+** <http://libqxt.org> <foundation@libqxt.org>
+**
+****************************************************************************/
+
+/*!
+ \class QxtHtmlTemplate QxtHtmlTemplate
+ \ingroup QxtWeb
+ \brief Basic Html Template Engine
+
+ open a file containing html code and php style variables.
+ use the square bracket operators to assign content for a variable
+
+ \code
+ QxtHtmlTemplate index;
+ if(!index.open)
+ return 404;
+ index["content"]="hello world";
+ echo()<<index.render();
+ \endcode
+ the realatet html code would look like:
+ \code
+ <html>
+ <head>
+ <title>Test Page</title>
+ </head>
+ <?=content?>
+ </html>
+ \endcode
+
+ funny storry: whe are using this class to make our documentation (eat your own dogfood, you know ;).
+ but when we where parsing exactly this file you read right now the first time, QxtHtmlTemplate got stuck in an infinite loop. guess why. becouse of that example above :D
+ So be warned: when you assign content to a variable that contains the variable name itself, render() will never return.
+
+
+*/
+
+/*!
+ \fn QxtHtmlTemplate::open(const QString& filename)
+ Returns true on sucess and false on failure.
+ note that it will also return false for an empty html file.
+
+ \fn QString QxtHtmlTemplate::render() const
+ Uses the variables you set and renders the opened file.
+ returns an empty string on failure.
+ Does NOT take care of not assigned variables, they will remain in the returned string
+ */
+
+#include "qxthtmltemplate.h"
+#include <QFile>
+#include <QStringList>
+
+QxtHtmlTemplate::QxtHtmlTemplate() : QMap<QString,QString>()
+{}
+
+void QxtHtmlTemplate::load(const QString& d)
+{
+ data=d;
+}
+
+bool QxtHtmlTemplate::open(const QString& filename)
+{
+ QFile f(filename);
+ f.open(QIODevice::ReadOnly);
+ data = QString::fromLocal8Bit(f.readAll());
+ f.close();
+ if (data.isEmpty())
+ {
+ qWarning("QxtHtmlTemplate::open(\"%s\") empty or non existant",qPrintable(filename));
+ return false;
+ }
+ return true;
+}
+
+QString QxtHtmlTemplate::render() const
+{
+ ///try to preserve indention by parsing char by char and saving the last non-space character
+
+
+ QString output = data;
+ int lastnewline=0;
+
+
+ for (int i=0;i<output.count();i++)
+ {
+ if (output.at(i)=='\n')
+ {
+ lastnewline=i;
+ }
+
+ if (output.at(i)=='<' && output.at(i+1)=='?' && output.at(i+2)=='=')
+ {
+ int j=i+3;
+ QString var;
+
+ for (int jj=j;jj<output.count();jj++)
+ {
+ if (output.at(jj)=='?' && output.at(jj+1)=='>')
+ {
+ j=jj;
+ break;
+ }
+ var+=output.at(jj);
+ }
+
+
+ if (j==i)
+ {
+ qWarning("QxtHtmlTemplate::render() unterminated <?= ");
+ continue;
+ }
+
+
+ if(!contains(var))
+ {
+ qWarning("QxtHtmlTemplate::render() unused variable \"%s\"",qPrintable(var));
+ continue;
+ }
+ output.replace(i,j-i+2,QString(value(var)).replace("\n","\n"+QString(i-lastnewline-1,QChar(' '))));
+
+ }
+
+
+ }
+
+ return output;
+}
+