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 ®, 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 }