23 #include "abstractlocalizer.h"
25 #include "exception.h"
26 #include "metaenumvariable_p.h"
30 #include <QtCore/QMetaEnum>
31 #include <QtCore/QStringList>
33 #include <QJsonDocument>
34 #include <QJsonObject>
52 QStringList m_lookups;
70 d_ptr->m_varString = other.d_ptr->m_varString;
71 d_ptr->m_literal = other.d_ptr->m_literal;
72 d_ptr->m_lookups = other.d_ptr->m_lookups;
73 d_ptr->m_localize = other.d_ptr->m_localize;
83 if (var.startsWith(QStringLiteral(
"_("))) {
85 Q_ASSERT(var.endsWith(QLatin1Char(
')')));
87 localVar = var.mid(2, var.size() - 3);
89 if (localVar.endsWith(QLatin1Char(
'.'))) {
93 QStringLiteral(
"Variable may not end with a dot: %1").arg(localVar));
96 auto processedNumber =
false;
98 const auto intResult = QLocale::c().toInt(localVar, &processedNumber);
99 if (processedNumber) {
100 d->m_literal = intResult;
102 const auto doubleResult
103 = QLocale::c().toDouble(localVar, &processedNumber);
104 if (processedNumber) {
105 d->m_literal = doubleResult;
109 if (!processedNumber) {
110 if (localVar.startsWith(QLatin1Char(
'"'))
111 || localVar.startsWith(QLatin1Char(
'\''))) {
113 Q_ASSERT(localVar.endsWith(QLatin1Char(
'\''))
114 || localVar.endsWith(QLatin1Char(
'"')));
117 d->m_literal = QVariant::fromValue<Cutelee::SafeString>(ss);
119 if (localVar.contains(QStringLiteral(
"._"))
120 || (localVar.startsWith(QLatin1Char(
'_')))) {
125 "Variables and attributes may not begin with underscores: %1")
128 d->m_lookups = localVar.split(QLatin1Char(
'.'));
136 return !d->m_varString.isEmpty();
142 return !d->m_literal.isNull();
150 return d->m_localize;
168 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
169 static const QMetaObject *_smo() {
return &QObject::staticQtMetaObject; }
171 static const QMetaObject *_smo() {
return &QObject::staticMetaObject; }
179 if (!d->m_lookups.isEmpty()) {
181 if (d->m_lookups.at(i) == QStringLiteral(
"Qt")) {
183 if (d->m_lookups.size() <= i)
186 const auto nextPart = d->m_lookups.at(i);
189 static auto globalMetaObject = StaticQtMetaObject::_smo();
191 auto breakout =
false;
192 for (
auto j = 0; j < globalMetaObject->enumeratorCount(); ++j) {
193 const auto me = globalMetaObject->enumerator(j);
195 if (QLatin1String(me.name()) == nextPart) {
196 const MetaEnumVariable mev(me);
197 var = QVariant::fromValue(mev);
201 for (
auto k = 0; k < me.keyCount(); ++k) {
202 if (QLatin1String(me.key(k)) == nextPart) {
203 const MetaEnumVariable mev(me, k);
204 var = QVariant::fromValue(mev);
216 var = c->
lookup(d->m_lookups.at(i++));
217 if (var.userType() == QMetaType::QJsonDocument) {
218 const auto jsonDoc = var.toJsonDocument();
219 if (jsonDoc.isArray()) {
220 var = jsonDoc.array().toVariantList();
221 }
else if (jsonDoc.isObject()) {
222 var = jsonDoc.object().toVariantHash();
227 }
else if (var.userType() == QMetaType::QJsonValue) {
228 const auto jsonVal = var.toJsonValue();
229 switch(jsonVal.type()) {
230 case QJsonValue::Bool:
231 var = jsonVal.toBool();
233 case QJsonValue::Double:
234 var = jsonVal.toDouble();
236 case QJsonValue::String:
237 var = jsonVal.toString();
239 case QJsonValue::Array:
240 case QJsonValue::Object:
241 var = jsonVal.toVariant();
246 }
else if (var.userType() == QMetaType::QJsonArray) {
247 var = var.toJsonArray().toVariantList();
248 }
else if (var.userType() == QMetaType::QJsonObject) {
249 var = var.toJsonObject().toVariantHash();
252 while (i < d->m_lookups.size()) {
253 var = MetaType::lookup(var, d->m_lookups.at(i++));
The Context class holds the context to render a Template with.
std::shared_ptr< AbstractLocalizer > localizer() const
virtual QVariant lookup(const QString &str) const
An exception for use when implementing template tags.
A container for static variables defined in Templates.
QStringList lookups() const
QVariant resolve(Context *c) const
bool isTrue(Context *c) const
Variable & operator=(const Variable &other)
The Cutelee namespace holds all public Cutelee API.
QString unescapeStringLiteral(const QString &input)
bool isSafeString(const QVariant &input)
Cutelee::SafeString getSafeString(const QVariant &input)
Cutelee::SafeString markSafe(const Cutelee::SafeString &input)
bool variantIsTrue(const QVariant &variant)
Utility functions used throughout Cutelee.