27#include <QSequentialIterable>
28#include <QtCore/QDateTime>
31 bool autoescape)
const
39 for (
auto it = iter.begin(); it != iter.end(); ++it) {
46 if ((it + 1) != iter.end()) {
55 bool autoescape)
const
62 if (input.
userType() == qMetaTypeId<SafeString>()
63 || input.
userType() == qMetaTypeId<QString>())
71 bool autoescape)
const
75 || (input.
userType() == qMetaTypeId<QDateTime>()))
81 else if (input.
userType() == qMetaTypeId<SafeString>()
82 || input.
userType() == qMetaTypeId<QString>())
91 return size == argInt;
95 bool autoescape)
const
105 if (iter.size() == 0)
108 return *iter.begin();
112 bool autoescape)
const
122 if (iter.size() == 0)
125 return *(iter.end() - 1);
129 bool autoescape)
const
137 auto varList = input.
value<QVariantList>();
139 if (varList.isEmpty())
143 auto rnd = rand() % varList.size();
144 return varList.at(rnd);
148 bool autoescape)
const
152 auto splitterIndex = argString.get().indexOf(
QLatin1Char(
':'));
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);
171 bool autoescape)
const
175 if (_input.
userType() == qMetaTypeId<QVariantList>())
178 return _input.
value<QVariantList>();
182 if (input.userType() == qMetaTypeId<int>()) {
183#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
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
215 return markSafe(processList(input.
value<QVariantList>(), 1, autoescape));
218SafeString UnorderedListFilter::processList(
const QVariantList &list,
int tabs,
219 bool autoescape)
const
222 for (
auto i = 0; i < tabs; ++i)
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;
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>")
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()) {
269 return (r.isValid());
271 return l.value<
int>() < r.value<
int>();
273 return l.value<uint>() < r.value<uint>();
275 return l.value<
long long>() < r.value<
long long>();
277 return l.value<
unsigned long long>() < r.value<
unsigned long long>();
279 return l.value<
float>() < r.value<
float>();
281 return l.value<
double>() < r.value<
double>();
283 return l.toChar() < r.toChar();
285 return l.toDate() < r.toDate();
287 return l.toTime() < r.toTime();
289 return l.toDateTime() < r.toDateTime();
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
324 for (
const QVariant &item : inList) {
332 const auto lookups = v.
lookups();
333 Q_FOREACH (
const QString &lookup, lookups) {
334 var = MetaType::lookup(var, lookup);
341 std::stable_sort(keyList.
begin(), keyList.
end(), lt);
343 QVariantList outList;
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)
QDateTime currentDateTimeUtc()
void append(const T &value)
const_iterator constBegin() const const
const_iterator constEnd() const const
void push_back(const T &value)
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const const
QString & append(QChar ch)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
const QChar at(int position) const const
bool isEmpty() const const
QString mid(int position, int n) const const
int toInt(bool *ok, int base) const const
QString join(const QString &separator) const const
bool canConvert(int targetTypeId) const const
bool isValid() const const
QString toString() const const
int userType() const const
Utility functions used throughout Cutelee.