File indexing completed on 2025-02-09 04:28:40

0001 /*
0002   This file is part of the KTextTemplate library
0003 
0004   SPDX-FileCopyrightText: 2009, 2010 Stephen Kelly <steveire@gmail.com>
0005 
0006   SPDX-License-Identifier: LGPL-2.1-or-later
0007 
0008 */
0009 
0010 #include "safestring.h"
0011 
0012 #include <QStringList>
0013 
0014 using namespace KTextTemplate;
0015 
0016 SafeString::SafeString()
0017     : m_nestedString(this)
0018     , m_safety(IsNotSafe)
0019     , m_needsescape(false)
0020 {
0021 }
0022 
0023 SafeString::SafeString(const KTextTemplate::SafeString &safeString)
0024     : m_nestedString(safeString.get(), this)
0025     , m_safety(safeString.m_safety)
0026     , m_needsescape(safeString.m_needsescape)
0027 {
0028 }
0029 
0030 SafeString::SafeString(const QString &str, bool safe)
0031     : m_nestedString(str, this)
0032     , m_safety(safe ? IsSafe : IsNotSafe)
0033     , m_needsescape(false)
0034 {
0035 }
0036 
0037 SafeString::SafeString(const QString &str, Safety safety)
0038     : m_nestedString(str, this)
0039     , m_safety(safety)
0040     , m_needsescape(false)
0041 {
0042 }
0043 
0044 SafeString::~SafeString() = default;
0045 
0046 void SafeString::setNeedsEscape(bool needsEscape)
0047 {
0048     m_needsescape = needsEscape;
0049 }
0050 
0051 bool SafeString::needsEscape() const
0052 {
0053     return m_needsescape;
0054 }
0055 
0056 void SafeString::setSafety(KTextTemplate::SafeString::Safety safety)
0057 {
0058     m_safety = safety;
0059 }
0060 
0061 bool SafeString::isSafe() const
0062 {
0063     return m_safety == IsSafe;
0064 }
0065 
0066 SafeString::NestedString::NestedString(SafeString *safeString)
0067     : m_safeString(safeString)
0068 {
0069 }
0070 
0071 SafeString::NestedString::NestedString(const QString &content, SafeString *safeString)
0072     : QString(content)
0073     , m_safeString(safeString)
0074 {
0075 }
0076 
0077 SafeString &SafeString::operator=(const SafeString &str)
0078 {
0079     if (&str == this)
0080         return *this;
0081     m_nestedString = str.m_nestedString;
0082     m_nestedString.m_safeString = this;
0083     m_safety = str.m_safety;
0084     m_needsescape = str.m_needsescape;
0085     return *this;
0086 }
0087 
0088 SafeString SafeString::operator+(const QString &str)
0089 {
0090     return {static_cast<QString>(m_nestedString) + str, IsNotSafe};
0091 }
0092 
0093 SafeString SafeString::operator+(const SafeString &str)
0094 {
0095     if (!str.isSafe())
0096         return {static_cast<QString>(m_nestedString) + static_cast<QString>(str.get()), IsNotSafe};
0097     return {static_cast<QString>(m_nestedString) + static_cast<QString>(str.get()), m_safety};
0098 }
0099 
0100 SafeString &SafeString::operator+=(const QString &str)
0101 {
0102     m_safety = IsNotSafe;
0103 
0104     m_nestedString += str;
0105     return *this;
0106 }
0107 
0108 SafeString &SafeString::operator+=(const SafeString &str)
0109 {
0110     if (!str.isSafe())
0111         m_safety = IsNotSafe;
0112 
0113     m_nestedString += str.get();
0114     return *this;
0115 }
0116 
0117 bool SafeString::operator==(const KTextTemplate::SafeString &other) const
0118 {
0119     // Don't compare safety or account for future escaping here.
0120     // See TestBuiltins testEscaping
0121     return m_nestedString == other.get();
0122 }
0123 
0124 bool SafeString::operator==(const QString &other) const
0125 {
0126     return m_nestedString == other;
0127 }
0128 
0129 SafeString &SafeString::NestedString::append(const SafeString &str)
0130 {
0131     QString::append(str.get());
0132     if (!str.isSafe())
0133         m_safeString->m_safety = IsNotSafe;
0134 
0135     return *m_safeString;
0136 }
0137 
0138 SafeString &SafeString::NestedString::append(const QString &str)
0139 {
0140     QString::append(str);
0141     m_safeString->m_safety = IsNotSafe;
0142     return *m_safeString;
0143 }
0144 
0145 SafeString &SafeString::NestedString::append(const QLatin1String &str)
0146 {
0147     QString::append(str);
0148     m_safeString->m_safety = IsNotSafe;
0149     return *m_safeString;
0150 }
0151 
0152 SafeString &SafeString::NestedString::append(const QChar ch)
0153 {
0154     QString::append(ch);
0155     m_safeString->m_safety = IsNotSafe;
0156     return *m_safeString;
0157 }
0158 
0159 void SafeString::NestedString::chop(int n)
0160 {
0161     QString::chop(n);
0162     m_safeString->m_safety = IsNotSafe;
0163 }
0164 
0165 SafeString &SafeString::NestedString::fill(QChar ch, int size)
0166 {
0167     QString::fill(ch, size);
0168     m_safeString->m_safety = IsNotSafe;
0169     return *m_safeString;
0170 }
0171 
0172 SafeString &SafeString::NestedString::insert(int position, const KTextTemplate::SafeString &str)
0173 {
0174     QString::insert(position, str.get());
0175     if (!str.isSafe())
0176         m_safeString->m_safety = IsNotSafe;
0177 
0178     return *m_safeString;
0179 }
0180 
0181 SafeString &SafeString::NestedString::insert(int position, const QString &str)
0182 {
0183     QString::insert(position, str);
0184     return *m_safeString;
0185 }
0186 
0187 SafeString &SafeString::NestedString::insert(int position, const QLatin1String &str)
0188 {
0189     QString::insert(position, str);
0190     return *m_safeString;
0191 }
0192 
0193 SafeString &SafeString::NestedString::insert(int position, const QChar *unicode, int size)
0194 {
0195     QString::insert(position, unicode, size);
0196     return *m_safeString;
0197 }
0198 
0199 SafeString &SafeString::NestedString::insert(int position, QChar ch)
0200 {
0201     QString::insert(position, ch);
0202     return *m_safeString;
0203 }
0204 
0205 SafeString SafeString::NestedString::left(int n) const
0206 {
0207     return {QString::left(n), m_safeString->m_safety};
0208 }
0209 
0210 SafeString SafeString::NestedString::leftJustified(int width, QChar fill, bool truncate) const
0211 {
0212     return {QString::leftJustified(width, fill, truncate), m_safeString->m_safety};
0213 }
0214 
0215 SafeString SafeString::NestedString::mid(int position, int n) const
0216 {
0217     return {QString::mid(position, n), m_safeString->m_safety};
0218 }
0219 
0220 SafeString SafeString::NestedString::normalized(QString::NormalizationForm mode) const
0221 {
0222     return {QString::normalized(mode), m_safeString->m_safety};
0223 }
0224 
0225 SafeString SafeString::NestedString::normalized(QString::NormalizationForm mode, QChar::UnicodeVersion version) const
0226 {
0227     return {QString::normalized(mode, version), m_safeString->m_safety};
0228 }
0229 
0230 SafeString &SafeString::NestedString::prepend(const KTextTemplate::SafeString &str)
0231 {
0232     QString::prepend(str.get());
0233     if (!str.isSafe())
0234         m_safeString->m_safety = IsNotSafe;
0235 
0236     return *m_safeString;
0237 }
0238 
0239 SafeString &SafeString::NestedString::prepend(const QString &str)
0240 {
0241     QString::prepend(str);
0242     m_safeString->m_safety = IsNotSafe;
0243     return *m_safeString;
0244 }
0245 
0246 SafeString &SafeString::NestedString::prepend(const QLatin1String &str)
0247 {
0248     QString::prepend(str);
0249     m_safeString->m_safety = IsNotSafe;
0250     return *m_safeString;
0251 }
0252 
0253 SafeString &SafeString::NestedString::prepend(QChar ch)
0254 {
0255     QString::prepend(ch);
0256     m_safeString->m_safety = IsNotSafe;
0257     return *m_safeString;
0258 }
0259 
0260 void SafeString::NestedString::push_back(const KTextTemplate::SafeString &other)
0261 {
0262     QString::push_back(other.get());
0263     m_safeString->m_safety = other.m_safety;
0264 }
0265 
0266 void SafeString::NestedString::push_front(const KTextTemplate::SafeString &other)
0267 {
0268     QString::push_front(other.get());
0269     m_safeString->m_safety = other.m_safety;
0270 }
0271 
0272 SafeString &SafeString::NestedString::remove(int position, int n)
0273 {
0274     QString::remove(position, n);
0275     m_safeString->m_safety = IsNotSafe;
0276     return *m_safeString;
0277 }
0278 
0279 SafeString &SafeString::NestedString::remove(QChar ch, Qt::CaseSensitivity cs)
0280 {
0281     QString::remove(ch, cs);
0282     m_safeString->m_safety = IsNotSafe;
0283     return *m_safeString;
0284 }
0285 
0286 SafeString &SafeString::NestedString::remove(const KTextTemplate::SafeString &str, Qt::CaseSensitivity cs)
0287 {
0288     QString::remove(str, cs);
0289     m_safeString->m_safety = IsNotSafe;
0290     return *m_safeString;
0291 }
0292 
0293 SafeString &SafeString::NestedString::remove(const QString &str, Qt::CaseSensitivity cs)
0294 {
0295     QString::remove(str, cs);
0296     m_safeString->m_safety = IsNotSafe;
0297     return *m_safeString;
0298 }
0299 
0300 SafeString &SafeString::NestedString::remove(const QRegularExpression &rx)
0301 {
0302     QString::remove(rx);
0303     m_safeString->m_safety = IsNotSafe;
0304     return *m_safeString;
0305 }
0306 
0307 SafeString SafeString::NestedString::repeated(int times) const
0308 {
0309     return {QString::repeated(times), m_safeString->m_safety};
0310 }
0311 
0312 SafeString &SafeString::NestedString::replace(int position, int n, const KTextTemplate::SafeString &after)
0313 {
0314     QString::replace(position, n, after.get());
0315     m_safeString->m_safety = after.m_safety;
0316     return *m_safeString;
0317 }
0318 
0319 SafeString &SafeString::NestedString::replace(int position, int n, const QString &after)
0320 {
0321     QString::replace(position, n, after);
0322     m_safeString->m_safety = IsNotSafe;
0323     return *m_safeString;
0324 }
0325 
0326 SafeString &SafeString::NestedString::replace(int position, int n, const QChar *unicode, int size)
0327 {
0328     QString::replace(position, n, unicode, size);
0329     m_safeString->m_safety = IsNotSafe;
0330     return *m_safeString;
0331 }
0332 
0333 SafeString &SafeString::NestedString::replace(int position, int n, QChar after)
0334 {
0335     QString::replace(position, n, after);
0336     m_safeString->m_safety = IsNotSafe;
0337     return *m_safeString;
0338 }
0339 
0340 SafeString &SafeString::NestedString::replace(const KTextTemplate::SafeString &before, const KTextTemplate::SafeString &after, Qt::CaseSensitivity cs)
0341 {
0342     QString::replace(before.get(), after.get(), cs);
0343     m_safeString->m_safety = after.m_safety;
0344     return *m_safeString;
0345 }
0346 
0347 SafeString &SafeString::NestedString::replace(const QString &before, const KTextTemplate::SafeString &after, Qt::CaseSensitivity cs)
0348 {
0349     QString::replace(before, after.get(), cs);
0350     m_safeString->m_safety = IsNotSafe;
0351     return *m_safeString;
0352 }
0353 
0354 SafeString &SafeString::NestedString::replace(const KTextTemplate::SafeString &before, const QString &after, Qt::CaseSensitivity cs)
0355 {
0356     QString::replace(before.get(), after, cs);
0357     m_safeString->m_safety = IsNotSafe;
0358     return *m_safeString;
0359 }
0360 
0361 SafeString &SafeString::NestedString::replace(const QString &before, const QString &after, Qt::CaseSensitivity cs)
0362 {
0363     QString::replace(before, after, cs);
0364     m_safeString->m_safety = IsNotSafe;
0365     return *m_safeString;
0366 }
0367 
0368 SafeString &SafeString::NestedString::replace(const QChar *before, int blen, const QChar *after, int alen, Qt::CaseSensitivity cs)
0369 {
0370     QString::replace(before, blen, after, alen, cs);
0371     m_safeString->m_safety = IsNotSafe;
0372     return *m_safeString;
0373 }
0374 
0375 SafeString &SafeString::NestedString::replace(QChar ch, const SafeString &after, Qt::CaseSensitivity cs)
0376 {
0377     QString::replace(ch, after.get(), cs);
0378     m_safeString->m_safety = after.m_safety;
0379     return *m_safeString;
0380 }
0381 
0382 SafeString &SafeString::NestedString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs)
0383 {
0384     QString::replace(ch, after, cs);
0385     m_safeString->m_safety = IsNotSafe;
0386     return *m_safeString;
0387 }
0388 
0389 SafeString &SafeString::NestedString::replace(QChar before, QChar after, Qt::CaseSensitivity cs)
0390 {
0391     QString::replace(before, after, cs);
0392     m_safeString->m_safety = IsNotSafe;
0393     return *m_safeString;
0394 }
0395 
0396 SafeString &SafeString::NestedString::replace(const QLatin1String &before, const QLatin1String &after, Qt::CaseSensitivity cs)
0397 {
0398     QString::replace(before, after, cs);
0399     m_safeString->m_safety = IsNotSafe;
0400     return *m_safeString;
0401 }
0402 
0403 SafeString &SafeString::NestedString::replace(const QLatin1String &before, const KTextTemplate::SafeString &after, Qt::CaseSensitivity cs)
0404 {
0405     QString::replace(before, after.get(), cs);
0406     m_safeString->m_safety = after.m_safety;
0407     return *m_safeString;
0408 }
0409 
0410 SafeString &SafeString::NestedString::replace(const QLatin1String &before, const QString &after, Qt::CaseSensitivity cs)
0411 {
0412     QString::replace(before, after, cs);
0413     m_safeString->m_safety = IsNotSafe;
0414     return *m_safeString;
0415 }
0416 
0417 SafeString &SafeString::NestedString::replace(const KTextTemplate::SafeString &before, const QLatin1String &after, Qt::CaseSensitivity cs)
0418 {
0419     QString::replace(before.get(), after, cs);
0420     m_safeString->m_safety = before.m_safety;
0421     return *m_safeString;
0422 }
0423 
0424 SafeString &SafeString::NestedString::replace(const QString &before, const QLatin1String &after, Qt::CaseSensitivity cs)
0425 {
0426     QString::replace(before, after, cs);
0427     m_safeString->m_safety = IsNotSafe;
0428     return *m_safeString;
0429 }
0430 
0431 SafeString &SafeString::NestedString::replace(QChar c, const QLatin1String &after, Qt::CaseSensitivity cs)
0432 {
0433     QString::replace(c, after, cs);
0434     m_safeString->m_safety = IsNotSafe;
0435     return *m_safeString;
0436 }
0437 
0438 SafeString &SafeString::NestedString::replace(const QRegularExpression &rx, const KTextTemplate::SafeString &after)
0439 {
0440     QString::replace(rx, after.get());
0441     m_safeString->m_safety = after.m_safety;
0442     return *m_safeString;
0443 }
0444 
0445 SafeString &SafeString::NestedString::replace(const QRegularExpression &rx, const QString &after)
0446 {
0447     QString::replace(rx, after);
0448     m_safeString->m_safety = IsNotSafe;
0449     return *m_safeString;
0450 }
0451 
0452 SafeString SafeString::NestedString::right(int n) const
0453 {
0454     return {QString::right(n), m_safeString->m_safety};
0455 }
0456 
0457 SafeString SafeString::NestedString::rightJustified(int width, QChar fill, bool truncate) const
0458 {
0459     return {QString::rightJustified(width, fill, truncate), m_safeString->m_safety};
0460 }
0461 
0462 SafeString SafeString::NestedString::section(const QRegularExpression &reg, int start, int end, QString::SectionFlags flags) const
0463 {
0464     return {QString::section(reg, start, end, flags), m_safeString->m_safety};
0465 }
0466 
0467 SafeString SafeString::NestedString::section(QChar sep, int start, int end, QString::SectionFlags flags) const
0468 {
0469     return {QString::section(sep, start, end, flags), m_safeString->m_safety};
0470 }
0471 
0472 SafeString SafeString::NestedString::section(const KTextTemplate::SafeString &sep, int start, int end, QString::SectionFlags flags) const
0473 {
0474     return {QString::section(sep, start, end, flags), m_safeString->m_safety};
0475 }
0476 
0477 SafeString SafeString::NestedString::section(const QString &sep, int start, int end, QString::SectionFlags flags) const
0478 {
0479     return {QString::section(sep, start, end, flags), m_safeString->m_safety};
0480 }
0481 
0482 SafeString &SafeString::NestedString::setNum(int n, int base)
0483 {
0484     QString::setNum(n, base);
0485     m_safeString->m_safety = IsNotSafe;
0486     return *m_safeString;
0487 }
0488 
0489 SafeString &SafeString::NestedString::setNum(uint n, int base)
0490 {
0491     QString::setNum(n, base);
0492     m_safeString->m_safety = IsNotSafe;
0493     return *m_safeString;
0494 }
0495 
0496 SafeString &SafeString::NestedString::setNum(long int n, int base)
0497 {
0498     QString::setNum(n, base);
0499     m_safeString->m_safety = IsNotSafe;
0500     return *m_safeString;
0501 }
0502 
0503 SafeString &SafeString::NestedString::setNum(ulong n, int base)
0504 {
0505     QString::setNum(n, base);
0506     m_safeString->m_safety = IsNotSafe;
0507     return *m_safeString;
0508 }
0509 
0510 SafeString &SafeString::NestedString::setNum(qlonglong n, int base)
0511 {
0512     QString::setNum(n, base);
0513     m_safeString->m_safety = IsNotSafe;
0514     return *m_safeString;
0515 }
0516 
0517 SafeString &SafeString::NestedString::setNum(qulonglong n, int base)
0518 {
0519     QString::setNum(n, base);
0520     m_safeString->m_safety = IsNotSafe;
0521     return *m_safeString;
0522 }
0523 
0524 SafeString &SafeString::NestedString::setNum(short int n, int base)
0525 {
0526     QString::setNum(n, base);
0527     m_safeString->m_safety = IsNotSafe;
0528     return *m_safeString;
0529 }
0530 
0531 SafeString &SafeString::NestedString::setNum(ushort n, int base)
0532 {
0533     QString::setNum(n, base);
0534     m_safeString->m_safety = IsNotSafe;
0535     return *m_safeString;
0536 }
0537 
0538 SafeString &SafeString::NestedString::setNum(double n, char format, int precision)
0539 {
0540     QString::setNum(n, format, precision);
0541     m_safeString->m_safety = IsNotSafe;
0542     return *m_safeString;
0543 }
0544 
0545 SafeString &SafeString::NestedString::setNum(float n, char format, int precision)
0546 {
0547     QString::setNum(n, format, precision);
0548     m_safeString->m_safety = IsNotSafe;
0549     return *m_safeString;
0550 }
0551 
0552 SafeString &SafeString::NestedString::setUnicode(const QChar *unicode, int size)
0553 {
0554     QString::setUnicode(unicode, size);
0555     m_safeString->m_safety = IsNotSafe;
0556     return *m_safeString;
0557 }
0558 
0559 SafeString &SafeString::NestedString::setUtf16(const ushort *unicode, int size)
0560 {
0561     QString::setUtf16(unicode, size);
0562     m_safeString->m_safety = IsNotSafe;
0563     return *m_safeString;
0564 }
0565 
0566 SafeString SafeString::NestedString::simplified() const
0567 {
0568     return {QString::simplified(), m_safeString->m_safety};
0569 }
0570 
0571 QStringList SafeString::NestedString::split(const KTextTemplate::SafeString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
0572 {
0573     return QString::split(sep.get(), behavior, cs);
0574 }
0575 
0576 QStringList SafeString::NestedString::split(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
0577 {
0578     return QString::split(sep, behavior, cs);
0579 }
0580 
0581 QStringList SafeString::NestedString::split(const QChar &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
0582 {
0583     return QString::split(sep, behavior, cs);
0584 }
0585 
0586 QStringList SafeString::NestedString::split(const QRegularExpression &rx, Qt::SplitBehavior behavior) const
0587 {
0588     return QString::split(rx, behavior);
0589 }
0590 
0591 SafeString SafeString::NestedString::toLower() const
0592 {
0593     return {QString::toLower(), IsNotSafe};
0594 }
0595 
0596 SafeString SafeString::NestedString::toUpper() const
0597 {
0598     return {QString::toUpper(), IsNotSafe};
0599 }
0600 
0601 SafeString SafeString::NestedString::trimmed() const
0602 {
0603     return {QString::trimmed(), m_safeString->m_safety};
0604 }