File indexing completed on 2024-05-12 05:15:01

0001 /*
0002  * SPDX-FileCopyrightText: 2015 Daniel Vrátil <dvratil@redhat.com>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-or-later
0005  *
0006  */
0007 
0008 #include <config-kcalutils.h>
0009 
0010 #include "grantleeki18nlocalizer_p.h"
0011 #include "grantleetemplatemanager_p.h"
0012 #include "qtresourcetemplateloader.h"
0013 
0014 #include <KTextTemplate/Engine>
0015 #include <KTextTemplate/Template>
0016 #include <KTextTemplate/TemplateLoader>
0017 #include <QDebug>
0018 #include <QStandardPaths>
0019 #include <QString>
0020 
0021 #include <KLocalizedString>
0022 
0023 GrantleeTemplateManager *GrantleeTemplateManager::sInstance = nullptr;
0024 
0025 GrantleeTemplateManager::GrantleeTemplateManager()
0026     : mEngine(new KTextTemplate::Engine)
0027     , mLoader(new KCalUtils::QtResourceTemplateLoader)
0028     , mLocalizer(new GrantleeKi18nLocalizer)
0029 {
0030     const QString path = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kcalendar/templates"), QStandardPaths::LocateDirectory);
0031     if (!path.isEmpty()) {
0032         mLoader->setTemplateDirs({path});
0033         mLoader->setTheme(QStringLiteral("default"));
0034     }
0035 
0036     mEngine->addTemplateLoader(mLoader);
0037     mEngine->addPluginPath(QStringLiteral(GRANTLEE_PLUGIN_INSTALL_DIR));
0038     mEngine->addDefaultLibrary(QStringLiteral("ktexttemplate_i18ntags"));
0039     mEngine->addDefaultLibrary(QStringLiteral("kcalendar_grantlee_plugin"));
0040     mEngine->setSmartTrimEnabled(true);
0041 }
0042 
0043 GrantleeTemplateManager::~GrantleeTemplateManager()
0044 {
0045     delete mEngine;
0046 }
0047 
0048 GrantleeTemplateManager *GrantleeTemplateManager::instance()
0049 {
0050     if (!sInstance) {
0051         sInstance = new GrantleeTemplateManager;
0052     }
0053     return sInstance;
0054 }
0055 
0056 void GrantleeTemplateManager::setTemplatePath(const QString &path)
0057 {
0058     mLoader->setTemplateDirs({path});
0059     mLoader->setTheme(QString());
0060 }
0061 
0062 void GrantleeTemplateManager::setPluginPath(const QString &path)
0063 {
0064     QStringList pluginPaths = mEngine->pluginPaths();
0065     pluginPaths.prepend(path);
0066     mEngine->setPluginPaths(pluginPaths);
0067 }
0068 KTextTemplate::Context GrantleeTemplateManager::createContext(const QVariantHash &hash) const
0069 {
0070     KTextTemplate::Context ctx;
0071     ctx.insert(QStringLiteral("incidence"), hash);
0072     ctx.setLocalizer(mLocalizer);
0073     return ctx;
0074 }
0075 
0076 QString GrantleeTemplateManager::errorTemplate(const QString &reason, const QString &origTemplateName, const KTextTemplate::Template &failedTemplate) const
0077 {
0078     KTextTemplate::Template tpl = mEngine->newTemplate(QStringLiteral("<h1>{{ error }}</h1>\n"
0079                                                                       "<b>%1:</b> {{ templateName }}<br>\n"
0080                                                                       "<b>%2:</b> {{ errorMessage }}")
0081                                                            .arg(i18n("Template"), i18n("Error message")),
0082                                                        QStringLiteral("TemplateError"));
0083 
0084     KTextTemplate::Context ctx = createContext();
0085     ctx.insert(QStringLiteral("error"), reason);
0086     ctx.insert(QStringLiteral("templateName"), origTemplateName);
0087     ctx.insert(QStringLiteral("errorMessage"), failedTemplate->errorString());
0088     return tpl->render(&ctx);
0089 }
0090 
0091 QString GrantleeTemplateManager::render(const QString &templateName, const QVariantHash &data) const
0092 {
0093     if (!mLoader->canLoadTemplate(templateName)) {
0094         qWarning() << "Cannot load template" << templateName << ", please check your installation";
0095         return QString();
0096     }
0097     KTextTemplate::Template tpl = mLoader->loadByName(templateName, mEngine);
0098     if (tpl->error()) {
0099         return errorTemplate(i18n("Template parsing error"), templateName, tpl);
0100     }
0101     KTextTemplate::Context ctx = createContext(data);
0102     const QString result = tpl->render(&ctx);
0103     if (tpl->error()) {
0104         return errorTemplate(i18n("Template rendering error"), templateName, tpl);
0105     }
0106     return result;
0107 }