21 #include "templateloader.h"
24 #include "exception.h"
25 #include "nulllocalizer_p.h"
27 #include <QtCore/QDir>
28 #include <QtCore/QFile>
29 #include <QtCore/QFileInfo>
40 std::shared_ptr<AbstractLocalizer> localizer)
44 : std::shared_ptr<AbstractLocalizer>(
new NullLocalizer))
51 QStringList m_templateDirs;
52 const std::shared_ptr<AbstractLocalizer> m_localizer;
57 const std::shared_ptr<AbstractLocalizer> localizer)
66 d_ptr->m_localizer->unloadCatalog(dir + QLatin1Char(
'/') +
themeName());
72 InMemoryTemplateLoader::~InMemoryTemplateLoader() {}
78 d->m_localizer->unloadCatalog(dir + QLatin1Char(
'/') + d->m_themeName);
87 return d->m_themeName;
95 d->m_localizer->unloadCatalog(dir + QLatin1Char(
'/') + d->m_themeName);
96 d->m_templateDirs = dirs;
98 d->m_localizer->loadCatalog(dir + QLatin1Char(
'/') + d->m_themeName,
105 return d->m_templateDirs;
114 while (!file.exists()) {
115 if (i >= d->m_templateDirs.size())
118 file.setFileName(d->m_templateDirs.at(i) + QLatin1Char(
'/') + d->m_themeName
119 + QLatin1Char(
'/') + name);
123 if (!file.exists() || !file.open(QIODevice::ReadOnly | QIODevice::Text)) {
131 Engine const *engine)
const
137 while (!file.exists()) {
138 if (i >= d->m_templateDirs.size())
141 file.setFileName(d->m_templateDirs.at(i) + QLatin1Char(
'/') + d->m_themeName
142 + QLatin1Char(
'/') + fileName);
143 const QFileInfo fi(file);
146 && !fi.canonicalFilePath().contains(
147 QDir(d->m_templateDirs.at(i)).canonicalPath()))
152 if (!file.exists() || !file.open(QIODevice::ReadOnly | QIODevice::Text)) {
156 QTextStream fstream(&file);
157 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
158 fstream.setCodec(
"UTF-8");
160 fstream.setEncoding(QStringConverter::Utf8);
162 const auto fileContent = fstream.readAll();
167 std::pair<QString, QString>
173 while (!file.exists()) {
174 if (i >= d->m_templateDirs.size())
177 file.setFileName(d->m_templateDirs.at(i) + QLatin1Char(
'/') + d->m_themeName
178 + QLatin1Char(
'/') + fileName);
180 const QFileInfo fi(file);
181 if (!fi.canonicalFilePath().contains(
182 QDir(d->m_templateDirs.at(i)).canonicalPath())) {
188 auto path = fi.absoluteFilePath();
189 path.chop(fileName.size());
190 return {path, fileName};
200 m_namedTemplates.insert(name, content);
205 return m_namedTemplates.contains(name);
209 Engine const *engine)
const
211 const auto it = m_namedTemplates.constFind(name);
212 if (it != m_namedTemplates.constEnd()) {
217 QStringLiteral(
"Couldn't load template %1. Template does not exist.")
221 std::pair<QString, QString>
226 return std::pair<QString, QString>();
An retrieval interface to a storage location for Template objects.
virtual ~AbstractTemplateLoader()
Cutelee::Engine is the main entry point for creating Cutelee Templates.
Template newTemplate(const QString &content, const QString &name) const
An exception for use when implementing template tags.
The FileSystemTemplateLoader loads Templates from the file system.
FileSystemTemplateLoader(const std::shared_ptr< AbstractLocalizer > localizer={})
Template loadByName(const QString &name, Engine const *engine) const override
void setTheme(const QString &themeName)
bool canLoadTemplate(const QString &name) const override
QStringList templateDirs() const
void setTemplateDirs(const QStringList &dirs)
QString themeName() const
~FileSystemTemplateLoader() override
std::pair< QString, QString > getMediaUri(const QString &fileName) const override
bool canLoadTemplate(const QString &name) const override
void setTemplate(const QString &name, const QString &content)
std::pair< QString, QString > getMediaUri(const QString &fileName) const override
Template loadByName(const QString &name, Engine const *engine) const override
The Template class is a tree of nodes which may be rendered.
The Cutelee namespace holds all public Cutelee API.