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::currentMSecsSinceEpoch());
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 input.convert(QMetaType(QMetaType::QString));
186 if (input.userType() == qMetaTypeId<SafeString>()
187 || input.userType() == qMetaTypeId<QString>()) {
190 for (
const auto &var : parts) {
200 bool autoescape)
const
204 if (!input.canConvert<QVariantList>())
207 return markSafe(processList(input.value<QVariantList>(), 1, autoescape));
210SafeString UnorderedListFilter::processList(
const QVariantList &list,
int tabs,
211 bool autoescape)
const
214 for (
auto i = 0; i < tabs; ++i)
215 indent.append(QLatin1Char(
'\t'));
219 auto listSize = list.size();
220 while (i < listSize) {
221 auto titleObject = list.at(i);
226 if (titleObject.userType() == qMetaTypeId<QVariantList>()) {
227 sublistItem = titleObject;
229 }
else if (i < listSize - 1) {
230 auto nextItem = list.at(i + 1);
231 if (nextItem.userType() == qMetaTypeId<QVariantList>()) {
232 sublistItem = nextItem;
236 if (sublistItem.isValid()) {
237 sublist = processList(sublistItem.value<QVariantList>(), tabs + 1,
239 sublist = QStringLiteral(
"\n%1<ul>\n%2\n%3</ul>\n%4")
240 .arg(indent, sublist, indent, indent);
242 output.append(QStringLiteral(
"%1<li>%2%3</li>")
250 return output.join(QChar::fromLatin1(
'\n'));
254 bool operator()(
const std::pair<QVariant, QVariant> &lp,
255 const std::pair<QVariant, QVariant> &rp)
const
257 const auto l = lp.first;
258 const auto r = rp.first;
259 switch (l.userType()) {
260 case QMetaType::UnknownType:
261 return (r.isValid());
263 return l.value<
int>() < r.value<
int>();
264 case QMetaType::UInt:
265 return l.value<uint>() < r.value<uint>();
266 case QMetaType::LongLong:
267 return l.value<
long long>() < r.value<
long long>();
268 case QMetaType::ULongLong:
269 return l.value<
unsigned long long>() < r.value<
unsigned long long>();
270 case QMetaType::Float:
271 return l.value<
float>() < r.value<
float>();
272 case QMetaType::Double:
273 return l.value<
double>() < r.value<
double>();
274 case QMetaType::Char:
275 return l.toChar() < r.toChar();
276 case QMetaType::QDate:
277 return l.toDate() < r.toDate();
278 case QMetaType::QTime:
279 return l.toTime() < r.toTime();
280 case QMetaType::QDateTime:
281 return l.toDateTime() < r.toDateTime();
282 case QMetaType::QObjectStar:
283 return l.value<QObject *>() < r.value<QObject *>();
285 if (l.userType() == qMetaTypeId<Cutelee::SafeString>()) {
286 if (r.userType() == qMetaTypeId<Cutelee::SafeString>()) {
289 }
else if (r.userType() == qMetaTypeId<QString>()) {
292 }
else if (r.userType() == qMetaTypeId<Cutelee::SafeString>()) {
293 if (l.userType() == qMetaTypeId<QString>()) {
296 }
else if (l.userType() == qMetaTypeId<QString>()) {
297 if (r.userType() == qMetaTypeId<QString>()) {
298 return l.toString() < r.toString();
307 bool autoescape)
const
311 if (!input.canConvert<QVariantList>())
314 QList<std::pair<QVariant, QVariant>> keyList;
315 const auto inList = input.value<QSequentialIterable>();
316 for (
const QVariant &item : inList) {
322 var = MetaType::lookup(var, v.
literal().toString());
324 const auto lookups = v.
lookups();
325 Q_FOREACH (
const QString &lookup, lookups) {
326 var = MetaType::lookup(var, lookup);
329 keyList.push_back({var, item});
333 std::stable_sort(keyList.begin(), keyList.end(), lt);
335 QVariantList outList;
336 auto it = keyList.constBegin();
337 const auto end = keyList.constEnd();
338 for (; it != end; ++it) {
339 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.