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(
'.'));
175 if (!d->m_lookups.isEmpty()) {
177 if (d->m_lookups.at(i) == QStringLiteral(
"Qt")) {
179 if (d->m_lookups.size() <= i)
182 const auto nextPart = d->m_lookups.at(i);
185 static auto globalMetaObject = StaticQtMetaObject::_smo();
187 auto breakout =
false;
188 for (
auto j = 0; j < globalMetaObject->enumeratorCount(); ++j) {
189 const auto me = globalMetaObject->enumerator(j);
191 if (QLatin1String(me.name()) == nextPart) {
192 const MetaEnumVariable mev(me);
193 var = QVariant::fromValue(mev);
197 for (
auto k = 0; k < me.keyCount(); ++k) {
198 if (QLatin1String(me.key(k)) == nextPart) {
199 const MetaEnumVariable mev(me, k);
200 var = QVariant::fromValue(mev);
212 var = c->
lookup(d->m_lookups.at(i++));
213 if (var.userType() == QMetaType::QJsonDocument) {
214 const auto jsonDoc = var.toJsonDocument();
215 if (jsonDoc.isArray()) {
216 var = jsonDoc.array().toVariantList();
217 }
else if (jsonDoc.isObject()) {
218 var = jsonDoc.object().toVariantHash();
223 }
else if (var.userType() == QMetaType::QJsonValue) {
224 const auto jsonVal = var.toJsonValue();
225 switch(jsonVal.type()) {
226 case QJsonValue::Bool:
227 var = jsonVal.toBool();
229 case QJsonValue::Double:
230 var = jsonVal.toDouble();
232 case QJsonValue::String:
233 var = jsonVal.toString();
235 case QJsonValue::Array:
236 case QJsonValue::Object:
237 var = jsonVal.toVariant();
242 }
else if (var.userType() == QMetaType::QJsonArray) {
243 var = var.toJsonArray().toVariantList();
244 }
else if (var.userType() == QMetaType::QJsonObject) {
245 var = var.toJsonObject().toVariantHash();
248 while (i < d->m_lookups.size()) {
249 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