18 #include "grantleeview_p.h"
20 #include "application.h"
26 #include <grantlee/qtlocalizer.h>
27 #include <grantlee/metatype.h>
30 #include <QDirIterator>
31 #include <QtCore/QLoggingCategory>
32 #include <QTranslator>
34 Q_LOGGING_CATEGORY(CUTELYST_GRANTLEE,
"cutelyst.grantlee", QtWarningMsg)
39 return object.value(property);
46 Grantlee::registerMetaType<ParamsMultiMap>();
50 d->engine =
new Grantlee::Engine(
this);
51 d->engine->addTemplateLoader(d->loader);
59 d->engine->addDefaultLibrary(QStringLiteral(
"grantlee_cutelyst"));
61 auto app = qobject_cast<Application *>(
parent);
68 d->cutelystVar = app->config(QStringLiteral(
"CUTELYST_VAR"), QStringLiteral(
"c")).toString();
70 app->loadTranslations(QStringLiteral(
"plugin_view_grantlee"));
80 return d->includePaths;
86 d->loader->setTemplateDirs(paths);
87 d->includePaths = paths;
91 QString GrantleeView::templateExtension()
const
100 d->extension = extension;
121 if (enable != d->cache.isNull()) {
126 d->engine =
new Grantlee::Engine(
this);
130 d->engine->addTemplateLoader(d->cache);
133 d->engine->addTemplateLoader(d->loader);
152 const auto includePaths = d->includePaths;
153 for (
const QString &includePath : includePaths) {
159 while (it.hasNext()) {
166 if (d->cache->canLoadTemplate(path)) {
167 d->cache->loadByName(path, d->engine);
176 return !d->cache.isNull();
185 const QVariantHash stash = c->
stash();
186 auto it = stash.constFind(QStringLiteral(
"template"));
188 if (it != stash.constEnd()) {
189 templateFile = it.value().toString();
192 templateFile = c->action()->
reverse() + d->extension;
194 templateFile.
remove(0, 1);
199 c->
error(QStringLiteral(
"Cannot render template, template name or template stash key not defined"));
204 qCDebug(CUTELYST_GRANTLEE) <<
"Rendering template" << templateFile;
206 Grantlee::Context gc(stash);
210 auto transIt = d->translators.constFind(c->
locale());
211 if (transIt != d->translators.constEnd()) {
212 localizer.data()->installTranslator(transIt.value(), transIt.key().name());
215 auto catalogIt = d->translationCatalogs.constBegin();
216 while (catalogIt != d->translationCatalogs.constEnd()) {
217 localizer.data()->loadCatalog(catalogIt.value(), catalogIt.key());
221 gc.setLocalizer(localizer);
223 Grantlee::Template tmpl = d->engine->loadByName(templateFile);
224 if (tmpl->error() != Grantlee::NoError) {
230 QString content = tmpl->render(&gc);
231 if (tmpl->error() != Grantlee::NoError) {
237 if (!d->wrapper.isEmpty()) {
238 Grantlee::Template wrapper = d->engine->loadByName(d->wrapper);
239 if (tmpl->error() != Grantlee::NoError) {
245 Grantlee::SafeString safeContent(content,
true);
246 gc.insert(QStringLiteral(
"content"), safeContent);
247 content = wrapper->render(&gc);
249 if (wrapper->error() != Grantlee::NoError) {
263 Q_ASSERT_X(translator,
"add translator to GrantleeView",
"invalid QTranslator object");
264 d->translators.insert(locale, translator);
275 Q_ASSERT_X(!path.
isEmpty(),
"add translation catalog to GrantleeView",
"empty path");
276 Q_ASSERT_X(!catalog.
isEmpty(),
"add translation catalog to GrantleeView",
"empty catalog name");
277 d->translationCatalogs.insert(catalog, path);
283 Q_ASSERT_X(!catalogs.
empty(),
"add translation catalogs to GranteleeView",
"empty QHash");
284 d->translationCatalogs.unite(catalogs);
292 const QDir i18nDir(directory);
293 if (Q_LIKELY(i18nDir.
exists())) {
294 const QString _prefix = prefix.
isEmpty() ? QStringLiteral(
".") : prefix;
295 const QString _suffix = suffix.
isEmpty() ? QStringLiteral(
".qm") : suffix;
298 if (Q_LIKELY(!tsFiles.empty())) {
299 locales.
reserve(tsFiles.size());
301 const QString fn = ts.fileName();
302 const int prefIdx = fn.
indexOf(_prefix);
307 if (Q_LIKELY(trans->load(loc, filename, _prefix, directory))) {
310 qCDebug(CUTELYST_GRANTLEE) <<
"Loaded translations for locale" << loc <<
"from" << ts.absoluteFilePath();
313 qCWarning(CUTELYST_GRANTLEE) <<
"Can not load translations for locale" << loc;
316 qCWarning(CUTELYST_GRANTLEE) <<
"Can not load translations for invalid locale string" << locString;
321 qCWarning(CUTELYST_GRANTLEE) <<
"Can not find translation files for" << filename <<
"in directory" << directory;
324 qCWarning(CUTELYST_GRANTLEE) <<
"Can not load translations from not existing directory:" << directory;
327 qCWarning(CUTELYST_GRANTLEE) <<
"Can not load translations for empty file name or empty path.";
333 #include "moc_grantleeview.cpp"
void stash(const QVariantHash &unite)
bool error() const
Returns true if an error was set.
QString translate(const char *context, const char *sourceText, const char *disambiguation=nullptr, int n=-1) const
void setStash(const QString &key, const QVariant &value)
QVector< QLocale > loadTranslationsFromDir(const QString &filename, const QString &directory, const QString &prefix=QStringLiteral("."), const QString &suffix=QStringLiteral(".qm"))
Grantlee::Engine * engine() const
QByteArray render(Context *c) const final
void setWrapper(const QString &name)
Sets the template wrapper name, the template will be rendered into content variable in which the wrap...
void addTranslator(const QLocale &locale, QTranslator *translator)
bool isCaching() const
Returns true if caching is enabled.
void setTemplateExtension(const QString &extension)
Sets the template extension, defaults to ".html".
GrantleeView(QObject *parent=nullptr, const QString &name=QString())
Constructs a GrantleeView object with the given parent and name.
void setIncludePaths(const QStringList &paths)
Sets the list of include paths which will be looked for when resolving templates files.
void setCache(bool enable)
Sets if template caching should be done, this increases performance at the cost of higher memory usag...
void addTranslationCatalog(const QString &path, const QString &catalog)
void addTranslationCatalogs(const QHash< QString, QString > &catalogs)
void setBody(QIODevice *body)
Cutelyst View abstract view component
The Cutelyst namespace holds all public Cutelyst API.
QFileInfoList entryInfoList(QDir::Filters filters, QDir::SortFlags sort) const const
bool exists() const const
QLocale::Language language() const const
QObject * parent() const const
QSharedPointer< T > create(Args &&... args)
QString fromLocal8Bit(const char *str, int size)
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
QString mid(int position, int n) const const
QString & remove(int position, int n)
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const const
QByteArray toUtf8() const const
QVariant fromValue(const T &value)
void append(const T &value)