21#include "stringfilters.h"
25#include <QtCore/QRegularExpression>
26#include <QtCore/QVariant>
27#include <QtCore/QJsonArray>
28#include <QtCore/QJsonObject>
29#include <QtCore/QJsonDocument>
33 bool autoescape)
const
43 .replace(
QLatin1Char(
'\''), QStringLiteral(
"\\\'"));
49 bool autoescape)
const
54 if (safeString.get().isEmpty())
57 return QVariant(safeString.get().at(0).toUpper()
59 safeString.get().right(safeString.get().size() - 1)));
62EscapeJsFilter::EscapeJsFilter() {}
68 QStringLiteral(
"\\u005C"))
70 QStringLiteral(
"\\u0027"))
72 QStringLiteral(
"\\u0022"))
74 QStringLiteral(
"\\u003E"))
76 QStringLiteral(
"\\u003C"))
78 QStringLiteral(
"\\u0026"))
80 QStringLiteral(
"\\u003D"))
82 QStringLiteral(
"\\u002D"))
84 QStringLiteral(
"\\u003B"))
85 << std::pair<QString, QString>(
QChar(0x2028), QStringLiteral(
"\\u2028"))
86 << std::pair<QString, QString>(
QChar(0x2029),
87 QStringLiteral(
"\\u2029"));
89 for (
auto i = 0; i < 32; ++i) {
90 jsEscapes << std::pair<QString, QString>(
92 QStringLiteral(
"\\u00")
93 + QStringLiteral(
"%1").arg(i, 2, 16,
QLatin1Char(
'0')).toUpper());
100 bool autoescape)
const
106 static const auto jsEscapes = getJsEscapes();
108 for (
auto &
escape : jsEscapes) {
116 bool autoescape)
const
123 QStringLiteral(
"&(?!(\\w+|#\\d+);)"));
125 safeString.get().replace(fixAmpersandsRegexp, QStringLiteral(
"&"));
131 bool autoescape)
const
137 auto inputSafe = retString.isSafe();
139 retString.get().remove(argString);
148 bool autoescape)
const
157 bool autoescape)
const
161 auto lines = safeString.get().split(
QLatin1Char(
'\n'));
164 const auto shouldEscape = (autoescape && !safeString.isSafe());
165 for (
auto i = 0; i < lines.size(); ++i) {
167 = QStringLiteral(
"%1. %2")
176 bool autoescape)
const
185 bool autoescape)
const
191 else if (input.
userType() == qMetaTypeId<QVariantList>()) {
192 a = toString(input.
value<QVariantList>());
200 bool autoescape)
const
207 auto it = str.
begin();
208 const auto end = str.
end();
211 for (; it != end; ++it) {
216 toUpper = it->isSpace();
224 bool autoescape)
const
230 auto numWords = s.get().toInt(&ok);
239 if (words.size() > numWords) {
240 words = words.mid(0, numWords);
241 if (!words.at(words.size() - 1).endsWith(QStringLiteral(
"..."))) {
242 words << QStringLiteral(
"...");
249 bool autoescape)
const
258 bool autoescape)
const
267 bool autoescape)
const
275 bool autoescape)
const
283 bool autoescape)
const
287 const auto valueWidth = value.
size();
289 const auto totalPadding = width - valueWidth;
290 const auto rightPadding = totalPadding >> 1;
296 bool autoescape)
const
305 bool autoescape)
const
314 bool autoescape)
const
321 QStringLiteral(
"<%1(/?>|(\\s+[^>]*>))").arg(tagRe));
325 const auto safeInput = value.isSafe();
326 value.get().remove(startTag);
327 value.get().remove(endTag);
335 bool autoescape)
const
349 bool autoescape)
const
353 auto width = argument.
value<
int>();
355 if (partList.isEmpty())
357 auto output = partList.takeFirst();
358 auto pos = output.size() - output.lastIndexOf(
QLatin1Char(
'\n')) - 1;
359 Q_FOREACH (
const QString &part, partList) {
366 pos += lines.
first().size() + 1;
369 pos += lines.
last().size();
372 if (lines.
size() > 1)
373 pos += lines.
last().size();
382 bool autoescape)
const
409 bool autoescape)
const
414 if (input.
userType() == qMetaTypeId<QVariantList>()) {
415 const auto inputList = input.
value<QVariantList>();
416 for (
const auto &item : inputList) {
425 bool autoescape)
const
432 Q_FOREACH (
const QString &bit, inputString.get().
split(re)) {
433 auto _bit =
SafeString(bit, inputString.isSafe());
436 _bit.get().replace(
QLatin1Char(
'\n'), QStringLiteral(
"<br />"));
437 output.
append(QStringLiteral(
"<p>%1</p>").arg(_bit));
444 bool autoescape)
const
452 inputString.get().replace(
QLatin1Char(
'\n'), QStringLiteral(
"<br />")));
462 static const QChar asciiEndPoint(128);
463 for (; it != end; ++it)
464 if (*it < asciiEndPoint)
472 bool autoescape)
const
478 inputString = nofailStringToAscii(inputString);
479 inputString = inputString.
trimmed()
488 bool autoescape)
const
494 bool numberConvert =
true;
498 size = input.
toReal(&numberConvert);
499 if (!numberConvert) {
500 qWarning(
"%s",
"Failed to convert input file size into floating point value.");
504 if (!numberConvert) {
505 qWarning(
"%s",
"Failed to convert input file size into floating point value.");
511 qreal multiplier = 1.0f;
513 if (!arg.get().isEmpty()) {
515 const auto numArgs = argList.size();
517 unitSystem = argList.at(0).toInt(&numberConvert);
518 if (!numberConvert) {
519 qWarning(
"%s",
"Failed to convert filse size format unit system into integer. Falling back to default 10.");
525 precision = argList.at(1).toInt(&numberConvert);
526 if (!numberConvert) {
527 qWarning(
"%s",
"Failed to convert file size format decimal precision into integer. Falling back to default 2.");
533 multiplier = argList.at(2).toDouble(&numberConvert);
534 if (!numberConvert) {
535 qWarning(
"%s",
"Failed to convert file size format multiplier into double value. Falling back to default 1.0");
538 if (multiplier == 0.0f) {
539 qWarning(
"%s",
"It makes no sense to multiply the file size by zero. Using default value 1.0.");
546 const double sizeMult = size * multiplier;
548 if (unitSystem == 10) {
549 if ((sizeMult > -1000) && (sizeMult < 1000)) {
552 }
else if (unitSystem == 2) {
553 if ((sizeMult > - 1024) && (sizeMult < 1024)) {
558 const std::pair<qreal,QString> sizePair =
calcFileSize(size, unitSystem, multiplier);
573 if(retString.
length() < count)
return retString;
575 retString.
append(QStringLiteral(
"..."));
582 const int len = input.
length();
583 esc.
reserve(
static_cast<int>(len * 1.2));
584 for (
int i = 0; i < len; ++i) {
587 esc += QStringLiteral(
"\\\\u003E");
589 esc += QStringLiteral(
"\\\\u003C");
591 esc += QStringLiteral(
"\\\\u0026");
617 qWarning(
"%s",
"Can not convert input data into QJsonObject or QJSonArray.");
622 jsonString = escapeJson(jsonString);
624 const QString scriptString = u
"<script id=\"" + arg + u
"\" type=\"application/json\">" + jsonString + u
"</script>";
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
SafeString escape(const QString &input) const
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
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=QVariant(), 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
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QVariant doFilter(const QVariant &input, const QVariant &argument=QVariant(), 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
std::pair< qreal, QString > calcFileSize(qreal size, int unitSystem=10, qreal multiplier=1.0)
bool isSafeString(const QVariant &input)
Cutelee::SafeString getSafeString(const QVariant &input)
Cutelee::SafeString markSafe(const Cutelee::SafeString &input)
Cutelee::SafeString markForEscaping(const Cutelee::SafeString &input)
void setArray(const QJsonArray &array)
void setObject(const QJsonObject &object)
QByteArray toJson(QJsonDocument::JsonFormat format) const const
void append(QList< T > &&value)
qsizetype size() const const
QString & append(QChar ch)
const QChar at(qsizetype position) const const
QString::iterator begin()
QString::const_iterator constBegin() const const
QString::const_iterator constEnd() const const
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
QString fromUtf8(QByteArrayView str)
QString leftJustified(qsizetype width, QChar fill, bool truncate) const const
qsizetype length() const const
QString normalized(QString::NormalizationForm mode, QChar::UnicodeVersion version) const const
QString number(double n, char format, int precision)
QString & remove(QChar ch, Qt::CaseSensitivity cs)
QString & replace(QChar before, QChar after, Qt::CaseSensitivity cs)
void reserve(qsizetype size)
QString rightJustified(qsizetype width, QChar fill, bool truncate) const const
qsizetype size() const const
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
double toDouble(bool *ok) const const
int toInt(bool *ok, int base) const const
QString toLower() const const
QString toUpper() const const
QString trimmed() const const
void truncate(qsizetype position)
QString join(QChar separator) const const
bool canConvert() const const
bool isNull() const const
bool isValid() const const
void setValue(QVariant &&value)
double toDouble(bool *ok) const const
QJsonArray toJsonArray() const const
QJsonDocument toJsonDocument() const const
QJsonObject toJsonObject() const const
qreal toReal(bool *ok) const const
QString toString() const const
int userType() const const
Utility functions used throughout Cutelee.