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