File indexing completed on 2025-02-09 04:28:40
0001 /* 0002 This file is part of the KTextTemplate library 0003 0004 SPDX-FileCopyrightText: 2009, 2010 Stephen Kelly <steveire@gmail.com> 0005 0006 SPDX-License-Identifier: LGPL-2.1-or-later 0007 0008 */ 0009 0010 #ifndef KTEXTTEMPLATE_TEMPLATELOADER_H 0011 #define KTEXTTEMPLATE_TEMPLATELOADER_H 0012 0013 #include "ktexttemplate_export.h" 0014 #include "template.h" 0015 0016 #include <QSharedPointer> 0017 0018 namespace KTextTemplate 0019 { 0020 0021 class AbstractLocalizer; 0022 0023 /// @headerfile templateloader.h <KTextTemplate/TemplateLoader> 0024 0025 /** 0026 @brief An retrieval interface to a storage location for Template objects. 0027 0028 This interface can be implemented to define new ways of retrieving the content 0029 of Templates. 0030 0031 The interface of this class should not be called directly from applications. 0032 TemplateLoaders will typically be created, configured and added to the 0033 KTextTemplate::Engine which will call the appropriate API. 0034 0035 @author Stephen Kelly <steveire@gmail.com> 0036 */ 0037 class KTEXTTEMPLATE_EXPORT AbstractTemplateLoader 0038 { 0039 public: 0040 /** 0041 Destructor 0042 */ 0043 virtual ~AbstractTemplateLoader(); 0044 0045 /** 0046 Load a Template called @p name. Return an invalid Template if no content 0047 by that name exists. 0048 */ 0049 virtual Template loadByName(const QString &name, Engine const *engine) const = 0; 0050 0051 /** 0052 Return a complete URI for media identified by fileName. 0053 */ 0054 virtual std::pair<QString, QString> getMediaUri(const QString &fileName) const = 0; 0055 0056 /** 0057 Return true if a Template identified by @p name exists and can be loaded. 0058 */ 0059 virtual bool canLoadTemplate(const QString &name) const = 0; 0060 }; 0061 0062 /// @headerfile templateloader.h KTextTemplate/templateloader.h 0063 0064 class FileSystemTemplateLoaderPrivate; 0065 0066 /** 0067 @brief The **%FileSystemTemplateLoader** loads Templates from the file system. 0068 0069 This template loader works by traversing a list of directories to find 0070 templates. Directories are checked in order, and the first match hit is parsed 0071 and returned. 0072 0073 @code 0074 loader->setTemplateDirs({ 0075 "/home/user/app/templates", 0076 "/usr/local/share/app/templates" 0077 }); 0078 engine->setTemplateLoader( loader ); 0079 0080 // This will try /home/user/app/templates/mytemplate.html 0081 // followed by /usr/local/share/app/templates/mytemplate.html 0082 engine->loadByName( "mytemplate.html" ); 0083 @endcode 0084 0085 Additionally, a themeName may be set on the template loader, which will be 0086 appended to search paths before the template name. 0087 0088 @code 0089 loader->setTemplateDirs({ 0090 "/home/user/app/templates" << 0091 "/usr/local/share/app/templates" 0092 }); 0093 loader->setTheme( "simple_theme" ); 0094 engine->setTemplateLoader( loader ); 0095 0096 // This will try /home/user/app/templates/simple_theme/mytemplate.html 0097 // followed by /usr/local/share/app/templates/simple_theme/mytemplate.html 0098 engine->loadByName( "mytemplate.html" ); 0099 @endcode 0100 0101 Media URIs may be retrieved for media relative to the directories searched 0102 queried for templates. 0103 0104 @code 0105 loader->setTemplateDirs({ 0106 "/home/user/app/templates", 0107 "/usr/local/share/app/templates" 0108 }); 0109 loader->setTheme( "simple_theme" ); 0110 engine->setTemplateLoader( loader ); 0111 0112 // This will try /home/user/app/templates/simple_theme/logo.png 0113 // followed by /usr/local/share/app/templates/simple_theme/logo.png 0114 // and return the first one that exists. 0115 engine->mediaUri( "logo.png" ); 0116 @endcode 0117 0118 The template files loaded by a %**FileSystemTemplateLoader** must be UTF-8 0119 encoded. 0120 0121 @see @ref deploying_templates 0122 0123 */ 0124 class KTEXTTEMPLATE_EXPORT FileSystemTemplateLoader : public AbstractTemplateLoader 0125 { 0126 public: 0127 /** 0128 Constructor 0129 */ 0130 FileSystemTemplateLoader(const QSharedPointer<AbstractLocalizer> localizer = {}); 0131 0132 /** 0133 Destructor 0134 */ 0135 ~FileSystemTemplateLoader() override; 0136 0137 Template loadByName(const QString &name, Engine const *engine) const override; 0138 0139 bool canLoadTemplate(const QString &name) const override; 0140 0141 std::pair<QString, QString> getMediaUri(const QString &fileName) const override; 0142 0143 /** 0144 Sets the theme of this loader to @p themeName 0145 */ 0146 void setTheme(const QString &themeName); 0147 0148 /** 0149 The themeName of this TemplateLoader 0150 */ 0151 QString themeName() const; 0152 0153 /** 0154 Sets the directories to look for template files to @p dirs. 0155 */ 0156 void setTemplateDirs(const QStringList &dirs); 0157 0158 /** 0159 The directories this TemplateLoader looks in for template files. 0160 */ 0161 QStringList templateDirs() const; 0162 0163 private: 0164 Q_DECLARE_PRIVATE(FileSystemTemplateLoader) 0165 FileSystemTemplateLoaderPrivate *const d_ptr; 0166 }; 0167 0168 /// @headerfile templateloader.h KTextTemplate/templateloader.h 0169 0170 /** 0171 @brief The **%InMemoryTemplateLoader** loads Templates set dynamically in 0172 memory 0173 0174 This class is mostly used for testing purposes, but can also be used for 0175 simple uses of %KTextTemplate. 0176 0177 Templates can be made available using the @ref setTemplate method, and will 0178 then be retrieved by the KTextTemplate::Engine as appropriate. 0179 */ 0180 class KTEXTTEMPLATE_EXPORT InMemoryTemplateLoader : public AbstractTemplateLoader 0181 { 0182 public: 0183 InMemoryTemplateLoader(); 0184 ~InMemoryTemplateLoader() override; 0185 0186 Template loadByName(const QString &name, Engine const *engine) const override; 0187 0188 bool canLoadTemplate(const QString &name) const override; 0189 0190 std::pair<QString, QString> getMediaUri(const QString &fileName) const override; 0191 0192 /** 0193 Add a template content to this Loader. 0194 0195 Example: 0196 0197 @code 0198 auto loader = QSharedPointer<InMemoryTemplateLoader::create(); 0199 loader->setTemplate( "name_template", "My name is {{ name }}" ); 0200 loader->setTemplate( "age_template", "My age is {{ age }}" ); 0201 engine->addTemplateLoader( loader ); 0202 0203 // Both templates may now be retrieved by calling Engine::loadByName. 0204 @endcode 0205 */ 0206 void setTemplate(const QString &name, const QString &content); 0207 0208 private: 0209 QHash<QString, QString> m_namedTemplates; 0210 }; 0211 } 0212 0213 #endif