1 // SPDX-FileCopyrightText: 2012 Illya Kovalevskyy <illya.kovalevskyy@gmail.com> 2 // 3 // SPDX-License-Identifier: LGPL-2.1-or-later 4 5 #include "TemplateDocument.h" 6 7 #include <QMap> 8 #include <QString> 9 #include <QFile> 10 #include <QRegExp> 11 12 #include "MarbleDebug.h" 13 14 namespace Marble 15 { 16 17 class TemplateDocumentPrivate 18 { 19 public: TemplateDocumentPrivate()20 TemplateDocumentPrivate() 21 { 22 } 23 QString templateText; 24 QMap<QString, QString> templateEntries; 25 static void processTemplateIncludes(QString &input); 26 }; 27 processTemplateIncludes(QString & input)28void TemplateDocumentPrivate::processTemplateIncludes(QString &input) 29 { 30 QRegExp rx("%!\\{([^}]*)\\}%"); 31 32 QStringList includes; 33 int pos = 0; 34 35 while ((pos = rx.indexIn(input, pos)) != -1) { 36 includes << rx.cap(1); 37 pos += rx.matchedLength(); 38 } 39 40 for (const QString &include: includes) { 41 QFile includeFile(QLatin1String(":/htmlfeatures/includes/") + include + QLatin1String(".inc")); 42 if (includeFile.open(QIODevice::ReadOnly)) { 43 input.replace(QLatin1String("%!{") + include + QLatin1String("}%"), includeFile.readAll()); 44 } else { 45 mDebug() << "[WARNING] Can't process template include" << include; 46 } 47 } 48 } 49 TemplateDocument()50TemplateDocument::TemplateDocument() : 51 d(new TemplateDocumentPrivate) 52 { 53 } 54 TemplateDocument(const QString & templateText)55TemplateDocument::TemplateDocument(const QString &templateText) : 56 d(new TemplateDocumentPrivate) 57 { 58 setTemplate(templateText); 59 } 60 ~TemplateDocument()61TemplateDocument::~TemplateDocument() 62 { 63 delete d; 64 } 65 setTemplate(const QString & newTemplateText)66void TemplateDocument::setTemplate(const QString &newTemplateText) 67 { 68 d->templateText = newTemplateText; 69 } 70 value(const QString & key) const71QString TemplateDocument::value(const QString &key) const 72 { 73 return d->templateEntries[key]; 74 } 75 setValue(const QString & key,const QString & value)76void TemplateDocument::setValue(const QString &key, const QString &value) 77 { 78 d->templateEntries[key] = value; 79 } 80 operator [](const QString & key)81QString& TemplateDocument::operator[](const QString &key) 82 { 83 return d->templateEntries[key]; 84 } 85 finalText() const86QString TemplateDocument::finalText() const 87 { 88 QString ready = d->templateText; 89 typedef QMap<QString, QString>::ConstIterator ConstIterator; 90 ConstIterator end = d->templateEntries.constEnd(); 91 for (ConstIterator i = d->templateEntries.constBegin(); i != end; i++) { 92 ready.replace(QLatin1Char('%') + i.key() + QLatin1Char('%'), i.value()); 93 } 94 d->processTemplateIncludes(ready); 95 return ready; 96 } 97 98 } // namespace Marble 99