27 #include <QSequentialIterable>
28 #include <QtCore/QDateTime>
31 bool autoescape)
const
33 if (!input.canConvert<QVariantList>())
36 auto iter = input.value<QSequentialIterable>();
39 for (
auto it = iter.begin(); it != iter.end(); ++it) {
46 if ((it + 1) != iter.end()) {
55 bool autoescape)
const
59 if (input.canConvert<QVariantList>())
60 return input.value<QSequentialIterable>().size();
62 if (input.userType() == qMetaTypeId<SafeString>()
63 || input.userType() == qMetaTypeId<QString>())
71 bool autoescape)
const
74 if (!input.isValid() || (input.userType() == qMetaTypeId<int>())
75 || (input.userType() == qMetaTypeId<QDateTime>()))
79 if (input.canConvert<QVariantList>())
80 size = input.value<QSequentialIterable>().size();
81 else if (input.userType() == qMetaTypeId<SafeString>()
82 || input.userType() == qMetaTypeId<QString>())
91 return size == argInt;
95 bool autoescape)
const
100 if (!input.canConvert<QVariantList>())
103 auto iter = input.value<QSequentialIterable>();
105 if (iter.size() == 0)
108 return *iter.begin();
112 bool autoescape)
const
117 if (!input.canConvert<QVariantList>())
120 auto iter = input.value<QSequentialIterable>();
122 if (iter.size() == 0)
125 return *(iter.end() - 1);
129 bool autoescape)
const
134 if (!input.canConvert<QVariantList>())
137 auto varList = input.value<QVariantList>();
139 if (varList.isEmpty())
142 srand(QDateTime::currentDateTimeUtc().toMSecsSinceEpoch());
143 auto rnd = rand() % varList.size();
144 return varList.at(rnd);
148 bool autoescape)
const
152 auto splitterIndex = argString.get().indexOf(QLatin1Char(
':'));
154 if (inputString.isEmpty())
157 if (splitterIndex >= 0) {
158 auto left = argString.get().left(splitterIndex).get().toInt();
159 auto right = argString.get().right(splitterIndex).get().toInt();
161 right = inputString.size() + right;
163 return inputString.mid(left, right);
165 return QString(inputString.at(argument.value<
int>()));
171 bool autoescape)
const
175 if (_input.userType() == qMetaTypeId<QVariantList>())
177 if (_input.canConvert<QVariantList>())
178 return _input.value<QVariantList>();
182 if (input.userType() == qMetaTypeId<int>()) {
183 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
184 input.convert(QMetaType::QString);
186 input.convert(QMetaType(QMetaType::QString));
190 if (input.userType() == qMetaTypeId<SafeString>()
191 || input.userType() == qMetaTypeId<QString>()) {
193 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
198 for (
const auto &var : parts) {
208 bool autoescape)
const
212 if (!input.canConvert<QVariantList>())
215 return markSafe(processList(input.value<QVariantList>(), 1, autoescape));
218 SafeString UnorderedListFilter::processList(
const QVariantList &list,
int tabs,
219 bool autoescape)
const
222 for (
auto i = 0; i < tabs; ++i)
223 indent.append(QLatin1Char(
'\t'));
227 auto listSize = list.size();
228 while (i < listSize) {
229 auto titleObject = list.at(i);
234 if (titleObject.userType() == qMetaTypeId<QVariantList>()) {
235 sublistItem = titleObject;
237 }
else if (i < listSize - 1) {
238 auto nextItem = list.at(i + 1);
239 if (nextItem.userType() == qMetaTypeId<QVariantList>()) {
240 sublistItem = nextItem;
244 if (sublistItem.isValid()) {
245 sublist = processList(sublistItem.value<QVariantList>(), tabs + 1,
247 sublist = QStringLiteral(
"\n%1<ul>\n%2\n%3</ul>\n%4")
248 .arg(indent, sublist, indent, indent);
250 output.append(QStringLiteral(
"%1<li>%2%3</li>")
258 return output.join(QChar::fromLatin1(
'\n'));
262 bool operator()(
const std::pair<QVariant, QVariant> &lp,
263 const std::pair<QVariant, QVariant> &rp)
const
265 const auto l = lp.first;
266 const auto r = rp.first;
267 switch (l.userType()) {
268 case QMetaType::UnknownType:
269 return (r.isValid());
271 return l.value<
int>() < r.value<
int>();
272 case QMetaType::UInt:
273 return l.value<uint>() < r.value<uint>();
274 case QMetaType::LongLong:
275 return l.value<
long long>() < r.value<
long long>();
276 case QMetaType::ULongLong:
277 return l.value<
unsigned long long>() < r.value<
unsigned long long>();
278 case QMetaType::Float:
279 return l.value<
float>() < r.value<
float>();
280 case QMetaType::Double:
281 return l.value<
double>() < r.value<
double>();
282 case QMetaType::Char:
283 return l.toChar() < r.toChar();
284 case QMetaType::QDate:
285 return l.toDate() < r.toDate();
286 case QMetaType::QTime:
287 return l.toTime() < r.toTime();
288 case QMetaType::QDateTime:
289 return l.toDateTime() < r.toDateTime();
290 case QMetaType::QObjectStar:
291 return l.value<QObject *>() < r.value<QObject *>();
293 if (l.userType() == qMetaTypeId<Cutelee::SafeString>()) {
294 if (r.userType() == qMetaTypeId<Cutelee::SafeString>()) {
297 }
else if (r.userType() == qMetaTypeId<QString>()) {
300 }
else if (r.userType() == qMetaTypeId<Cutelee::SafeString>()) {
301 if (l.userType() == qMetaTypeId<QString>()) {
304 }
else if (l.userType() == qMetaTypeId<QString>()) {
305 if (r.userType() == qMetaTypeId<QString>()) {
306 return l.toString() < r.toString();
315 bool autoescape)
const
319 if (!input.canConvert<QVariantList>())
322 QList<std::pair<QVariant, QVariant>> keyList;
323 const auto inList = input.value<QSequentialIterable>();
324 for (
const QVariant &item : inList) {
330 var = MetaType::lookup(var, v.
literal().toString());
332 const auto lookups = v.
lookups();
333 Q_FOREACH (
const QString &lookup, lookups) {
334 var = MetaType::lookup(var, lookup);
337 keyList.push_back({var, item});
341 std::stable_sort(keyList.begin(), keyList.end(), lt);
343 QVariantList outList;
344 auto it = keyList.constBegin();
345 const auto end = keyList.constEnd();
346 for (; it != end; ++it) {
347 outList << it->second;
SafeString conditionalEscape(const SafeString &input) const
A QString wrapper class for containing whether a string is safe or needs to be escaped.
const NestedString & get() const
A container for static variables defined in Templates.
QStringList lookups() const
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
Cutelee::SafeString getSafeString(const QVariant &input)
Cutelee::SafeString markSafe(const Cutelee::SafeString &input)
Utility functions used throughout Cutelee.