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