File indexing completed on 2024-04-28 15:16:11

0001 // SPDX-FileCopyrightText: 2012 Illya Kovalevskyy <illya.kovalevskyy@gmail.com>
0002 //
0003 // SPDX-License-Identifier: LGPL-2.1-or-later
0004 
0005 #include "TemplateDocument.h"
0006 
0007 #include <QMap>
0008 #include <QString>
0009 #include <QFile>
0010 #include <QRegExp>
0011 
0012 #include "MarbleDebug.h"
0013 
0014 namespace Marble
0015 {
0016 
0017 class TemplateDocumentPrivate
0018 {
0019 public:
0020     TemplateDocumentPrivate()
0021     {
0022     }
0023     QString templateText;
0024     QMap<QString, QString> templateEntries;
0025     static void processTemplateIncludes(QString &input);
0026 };
0027 
0028 void TemplateDocumentPrivate::processTemplateIncludes(QString &input)
0029 {
0030     QRegExp rx("%!\\{([^}]*)\\}%");
0031 
0032     QStringList includes;
0033     int pos = 0;
0034 
0035     while ((pos = rx.indexIn(input, pos)) != -1) {
0036         includes << rx.cap(1);
0037         pos += rx.matchedLength();
0038     }
0039 
0040     for (const QString &include: includes) {
0041         QFile includeFile(QLatin1String(":/htmlfeatures/includes/") + include + QLatin1String(".inc"));
0042         if (includeFile.open(QIODevice::ReadOnly)) {
0043             input.replace(QLatin1String("%!{") + include + QLatin1String("}%"), includeFile.readAll());
0044         } else {
0045             mDebug() << "[WARNING] Can't process template include" << include;
0046         }
0047     }
0048 }
0049 
0050 TemplateDocument::TemplateDocument() :
0051     d(new TemplateDocumentPrivate)
0052 {
0053 }
0054 
0055 TemplateDocument::TemplateDocument(const QString &templateText) :
0056     d(new TemplateDocumentPrivate)
0057 {
0058     setTemplate(templateText);
0059 }
0060 
0061 TemplateDocument::~TemplateDocument()
0062 {
0063     delete d;
0064 }
0065 
0066 void TemplateDocument::setTemplate(const QString &newTemplateText)
0067 {
0068     d->templateText = newTemplateText;
0069 }
0070 
0071 QString TemplateDocument::value(const QString &key) const
0072 {
0073     return d->templateEntries[key];
0074 }
0075 
0076 void TemplateDocument::setValue(const QString &key, const QString &value)
0077 {
0078     d->templateEntries[key] = value;
0079 }
0080 
0081 QString& TemplateDocument::operator[](const QString &key)
0082 {
0083     return d->templateEntries[key];
0084 }
0085 
0086 QString TemplateDocument::finalText() const
0087 {
0088     QString ready = d->templateText;
0089     typedef QMap<QString, QString>::ConstIterator ConstIterator;
0090     ConstIterator end = d->templateEntries.constEnd();
0091     for (ConstIterator i = d->templateEntries.constBegin(); i != end; i++) {
0092         ready.replace(QLatin1Char('%') + i.key() + QLatin1Char('%'), i.value());
0093     }
0094     d->processTemplateIncludes(ready);
0095     return ready;
0096 }
0097 
0098 } // namespace Marble