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 }