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)));
62 EscapeJsFilter::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")
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>";
const_iterator constBegin() const const
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QString & append(QChar ch)
QVariant doFilter(const QVariant &input, const QVariant &argument=QVariant(), bool autoescape={}) const override
QString toUpper() const const
void truncate(qsizetype position)
QByteArray toJson(JsonFormat format) const const
QJsonDocument toJsonDocument() const const
Cutelee::SafeString markSafe(const Cutelee::SafeString &input)
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
SafeString escape(const QString &input) const
void setArray(const QJsonArray &array)
qsizetype size() const const
char32_t toUpper(char32_t ucs4)
QString join(QChar separator) const const
QString fromUtf8(QByteArrayView str)
double toDouble(bool *ok) const 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
qsizetype size() const const
bool isSafeString(const QVariant &input)
QString normalized(NormalizationForm mode, QChar::UnicodeVersion version) const 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
SafeString conditionalEscape(const SafeString &input) const
Cutelee::SafeString markForEscaping(const Cutelee::SafeString &input)
const_iterator constEnd() const const
QString number(double n, char format, int precision)
bool canConvert() const const
QJsonObject toJsonObject() const 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
bool isNull() const const
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QString rightJustified(qsizetype width, QChar fill, bool truncate) const 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
int toInt(bool *ok, int base) const const
QString trimmed() const const
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
Utility functions used throughout Cutelee.
A QString wrapper class for containing whether a string is safe or needs to be escaped.
int userType() const const
QString toLower() const const
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QString & remove(QChar ch, Qt::CaseSensitivity cs)
QString & replace(QChar before, QChar after, Qt::CaseSensitivity cs)
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
void append(QList< T > &&value)
const QChar at(qsizetype position) const const
QList< T > mid(qsizetype pos, qsizetype length) const const
qsizetype length() const const
QJsonArray toJsonArray() const const
void reserve(qsizetype size)
QString leftJustified(qsizetype width, QChar fill, bool truncate) const const
QVariant doFilter(const QVariant &input, const QVariant &argument=QVariant(), bool autoescape={}) const override
void setObject(const QJsonObject &object)
bool isValid() const const
double toDouble(bool *ok) const const
std::pair< qreal, QString > calcFileSize(qreal size, int unitSystem=10, qreal multiplier=1.0)
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
qreal toReal(bool *ok) const const
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
QString toString() const const
const NestedString & get() const
QVariant doFilter(const QVariant &input, const QVariant &argument={}, bool autoescape={}) const override
Cutelee::SafeString getSafeString(const QVariant &input)
void setValue(QVariant &&value)