12#include <QRegularExpression>
13#include <QStringBuilder>
20 return removeChars(s, [](QChar c) {
return c == u
' ' || c == u
':' || c == u
'_' || c == u
'-' || c == u
'.'; });
25 return splitStringRefs(s, [](QChar c) {
return c ==
'\n' || c ==
'\r'; });
30 return splitString(s, [](QChar c) {
return c ==
'\n' || c ==
'\r'; });
36 for (
const QChar &c : s)
38 if (
const char latin = c.toLatin1())
40 if ((latin >=
'a' && latin <=
'z') || (latin >=
'A' && latin <=
'Z') ||
41 (latin >=
'0' && latin <=
'9') || allow.
contains(latin))
43 result += c.toLatin1();
59 const ushort unicode = c.unicode();
81 for (
int i = 0; i < ba.
size(); ++i)
86 Q_ASSERT(i < ba.
size());
90 Q_ASSERT(i < ba.
size());
91 result += QChar(ba.
mid(i, 4).
toInt(
nullptr, 16));
96 result +=
static_cast<char>(ba.
mid(i, 2).toInt(
nullptr, 16));
110 static const QString on(
"on");
111 static const QString off(
"off");
117 static const QString yes(
"yes");
118 static const QString no(
"no");
124 static const QString t(
"true");
125 static const QString f(
"false");
131 static const QString e(
"enabled");
132 static const QString d(
"disabled");
138 static const QString n(
"null");
139 static const QString nn(
"not null");
140 return isNull ? n : nn;
145 QString s(
string.trimmed().
toLower());
152 const QChar c = s.at(0);
153 if (c ==
'1' || c ==
't' || c ==
'y' || c ==
'x')
157 if (c ==
'0' || c ==
'f' || c ==
'n' || c ==
'_')
189 else if (str1 == str2)
201 const QString aStr = str1.
length() >= str2.
length() ? str1 : str2;
202 const QString bStr = str1.
length() >= str2.
length() ? str2 : str1;
205 const auto s1 =
static_cast<double>(aStr.
length());
206 const auto s2 =
static_cast<double>(bStr.
length());
209 return qRound(s1 / s2 * 100);
213 return qRound(s1 / s2 * 100);
219 return qRound(s1 / s2 * 100);
224 for (
int p = 0; p < aStr.
length(); p++)
226 if (p < bStr.
length() && aStr[p] == bStr[p])
233 const int after = p + 1;
234 if (after < bStr.
length() && aStr[p] == bStr[after])
241 const int before = p - 1;
242 if (before >= 0 && before < bStr.
length() && aStr[p] == bStr[before])
248 return qRound(points / s1 * 100);
251 QString
intToHex(
int value,
int digits)
254 const qsizetype l =
hex.length();
257 return hex.right(digits);
259 const qsizetype d = digits - l;
260 return QString(d,
'0') +
hex;
270 return s.contains(
' ') ? s.left(s.indexOf(
' ')) : s;
278 static const QString diacriticLetters =
279 QString::fromUtf8(
"ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ");
280 static const QStringList noDiacriticLetters(
281 {
"S",
"OE",
"Z",
"s",
"oe",
"z",
"Y",
"Y",
"u",
"A",
"A",
"A",
"A",
"A",
"A",
"AE",
"C",
"E",
282 "E",
"E",
"E",
"I",
"I",
"I",
"I",
"D",
"N",
"O",
"O",
"O",
"O",
"O",
"O",
"U",
"U",
"U",
283 "U",
"Y",
"s",
"a",
"a",
"a",
"a",
"a",
"a",
"ae",
"c",
"e",
"e",
"e",
"e",
"i",
"i",
"i",
284 "i",
"o",
"n",
"o",
"o",
"o",
"o",
"o",
"o",
"u",
"u",
"u",
"u",
"y",
"y" });
287 for (
const QChar c : candidate)
289 const qsizetype dIndex = diacriticLetters.
indexOf(c);
296 const QString replacement = noDiacriticLetters[dIndex];
297 output.append(replacement);
308 for (
const QChar &c : s)
338 QDateTime
fromStringUtc(
const QString &dateTimeString,
const QString &format)
374 QDateTime dt = locale.
toDateTime(dateTimeString, format);
392 if (dateTimeString.
length() == 17)
396 if (dateTimeString.
length() == 14)
400 if (dateTimeString.
length() == 12)
404 if (dateTimeString.
length() == 8)
441 if (dateTimeString.
length() < 8)
448 int year(QStringView { dateTimeString }.left(4).toInt());
449 int month(QStringView { dateTimeString }.mid(4, 2).toInt());
450 int day(QStringView { dateTimeString }.mid(6, 2).toInt());
452 date.
setDate(year, month, day);
456 if (dateTimeString.
length() < 12)
462 const int hour(QStringView { dateTimeString }.mid(8, 2).toInt());
463 const int minute(QStringView { dateTimeString }.mid(10, 2).toInt());
464 const int second(dateTimeString.
length() < 14 ? 0 : QStringView { dateTimeString }.mid(12, 2).toInt());
465 const int ms(dateTimeString.
length() < 17 ? 0 : QStringView { dateTimeString }.right(3).toInt());
467 t.
setHMS(hour, minute, second, ms);
493 return ignoreEmpty ? QString() : QStringLiteral(
"''");
495 return u
'\'' % in % u
'\'';
498 QString
inQuotes(
const QString &in,
bool ignoreEmpty)
502 return ignoreEmpty ? QString() : QStringLiteral(
"\"\"");
504 return u
'"' % in % u
'"';
513 return question % u
'?';
518 if (nth < 1 ||
string.isEmpty() || nth >
string.length())
525 for (
int t = 0; t < nth; ++t)
527 ci =
string.indexOf(ch, from, cs);
533 if (from >=
string.length())
541 QString
joinStringSet(
const QSet<QString> &set,
const QString &separator)
551 return set.
values().join(separator);
556 QMap<QString, QString>
map;
558 for (
const QStringView l : lines)
564 const qsizetype i = l.indexOf(
'=');
565 if (i < 0 || i >= l.length() + 1)
570 const QString key = l.left(i).trimmed().toString();
571 const QString value = l.mid(i + 1).toString();
576 map.insert(key, value);
607 QString
removeComments(
const QString &in,
bool removeSlashStar,
bool removeDoubleSlash)
611 thread_local const QRegularExpression re1(R
"(\/\*(.|\n)*?\*\/)");
617 thread_local const QRegularExpression re2(
"\\/\\/.*");
618 if (removeDoubleSlash)
632 return std::ranges::any_of(any, [&](
const QString &a) {
return testString.
contains(a, cs); });
641 const qsizetype c = in.
count(quote);
645 double parseFraction(
const QString &fraction,
double failDefault)
653 double r = failDefault;
656 const QStringList parts = fraction.
split(
'/');
657 if (parts.
size() != 2)
661 const double c = parts.
front().trimmed().toDouble(&ok);
667 const double d = parts.
last().trimmed().toDouble(&ok);
672 if (qFuzzyCompare(0.0, d))
704 while (dp >= 0 && !n.
isEmpty())
706 const QChar l = n.
at(n.
size() - 1);
712 if (l ==
'.' || l ==
',')
Free functions in swift::misc.
SWIFT_MISC_EXPORT QString withQuestionMark(const QString &question)
Add a question mark at the end if not existing.
SWIFT_MISC_EXPORT QString simplifyNameForSearch(const QString &name)
Get a simplified upper case name for searching by removing all characters except A-Z.
SWIFT_MISC_EXPORT qsizetype nthIndexOf(const QString &string, QChar ch, int nth=1, Qt::CaseSensitivity cs=Qt::CaseInsensitive)
nth index of ch
SWIFT_MISC_EXPORT QString cleanNumber(const QString &number)
Remove leading 0, trailing 0, " ", and "." from a number.
SWIFT_MISC_EXPORT QString inApostrophes(const QString &in, bool ignoreEmpty=false)
Return string in apostrophes.
SWIFT_MISC_EXPORT QString intToHex(int value, int digits=2)
Int to hex value.
SWIFT_MISC_EXPORT QByteArray utfToPercentEncoding(const QString &s, const QByteArray &allow={}, char percent='%')
Extended percent encoding supporting UTF-16.
SWIFT_MISC_EXPORT QString stripDesignatorFromCompleterString(const QString &candidate)
Strip a designator from a combined string.
SWIFT_MISC_EXPORT QDateTime parseMultipleDateTimeFormats(const QString &dateTimeString)
Parse multiple date time formats.
SWIFT_MISC_EXPORT const QString & boolToTrueFalse(bool v)
Bool to true/false.
SWIFT_MISC_EXPORT QString utfFromPercentEncoding(const QByteArray &ba, char percent='%')
Reverse utfFromPercentEncoding.
SWIFT_MISC_EXPORT const QString & boolToEnabledDisabled(bool v)
Bool to enabled/disabled.
SWIFT_MISC_EXPORT int fuzzyShortStringComparision(const QString &str1, const QString &str2, Qt::CaseSensitivity cs=Qt::CaseSensitive)
Fuzzy compare for short strings (like ICAO designators).
QString removeChars(const QString &s, F predicate)
Return a string with characters removed that match the given predicate.
SWIFT_MISC_EXPORT const QString & boolToOnOff(bool v)
Bool to on/off.
SWIFT_MISC_EXPORT QString removeDateTimeSeparators(const QString &s)
Remove the typical separators such as "-", " ".
SWIFT_MISC_EXPORT const QString & boolToYesNo(bool v)
Bool to yes/no.
SWIFT_MISC_EXPORT QString simplifyByDecomposition(const QString &candidate)
Remove accents / diacritic marks from a string by doing a Unicode decomposition and removing mark cha...
SWIFT_MISC_EXPORT bool caseInsensitiveStringCompare(const QString &c1, const QString &c2)
Case insensitive string compare.
SWIFT_MISC_EXPORT QString removeSurroundingQuotes(const QString &in)
Remove surrounding quotes "foo" -> foo.
SWIFT_MISC_EXPORT double parseFraction(const QString &fraction, double failDefault=std::numeric_limits< double >::quiet_NaN())
Parse a fraction like 2/3.
SWIFT_MISC_EXPORT bool hasBalancedQuotes(const QString &in, char quote='"')
Has balanced quotes.
SWIFT_MISC_EXPORT QString dotToLocaleDecimalPoint(QString &input)
Replace dot '.' by locale decimal point.
SWIFT_MISC_EXPORT const QString & boolToNullNotNull(bool isNull)
Bool isNull to null/no null.
SWIFT_MISC_EXPORT QString simplifyAccents(const QString &candidate)
Remove accents / diacritic marks from a string.
SWIFT_MISC_EXPORT bool stringCompare(const QString &c1, const QString &c2, Qt::CaseSensitivity cs)
String compare.
SWIFT_MISC_EXPORT QMap< QString, QString > parseIniValues(const QString &data)
Obtain ini file like values, e.g. foo=bar.
SWIFT_MISC_EXPORT QString inQuotes(const QString &in, bool ignoreEmpty=false)
Return string in quotes.
SWIFT_MISC_EXPORT QString removeSurroundingApostrophes(const QString &in)
Remove surrounding apostrophes 'foo' -> foo.
QList< QStringView > splitStringRefs(const QString &s, F predicate)
Split a string into multiple strings, using a predicate function to identify the split points.
SWIFT_MISC_EXPORT QString joinStringSet(const QSet< QString > &set, const QString &separator)
Convert string to bool.
SWIFT_MISC_EXPORT QStringList splitLines(const QString &s)
Split a string into multiple lines. Blank lines are skipped.
SWIFT_MISC_EXPORT QString removeComments(const QString &in, bool removeSlash, bool removeDoubleSlash)
Remove comments such as /** **/ or //.
SWIFT_MISC_EXPORT QList< QStringView > splitLinesRefs(const QString &s)
Split a string into multiple lines. Blank lines are skipped.
QStringList splitString(const QString &s, F predicate)
Split a string into multiple strings, using a predicate function to identify the split points.
SWIFT_MISC_EXPORT bool stringToBool(const QString &boolString)
Convert string to bool.
SWIFT_MISC_EXPORT bool containsAny(const QString &testString, const QStringList &any, Qt::CaseSensitivity cs)
Contains any string of the list?
bool isDigitsOnlyString(const QString &testString)
String with digits only.
SWIFT_MISC_EXPORT QDateTime fromStringUtc(const QString &dateTimeString, const QString &format)
Same as QDateTime::fromString but QDateTime will be set to UTC.
SWIFT_MISC_EXPORT QDateTime parseDateTimeStringOptimized(const QString &dateTimeString)
Parse yyyyMMddHHmmsszzz strings optimized.
bool contains(QByteArrayView bv) const const
QByteArray mid(qsizetype pos, qsizetype len) &&
QByteArray number(double n, char format, int precision)
qsizetype size() const const
int toInt(bool *ok, int base) const const
QString decomposition(char32_t ucs4)
QChar::Decomposition decompositionTag(char32_t ucs4)
bool setDate(int year, int month, int day)
QDateTime fromString(QStringView string, QStringView format, QCalendar cal)
bool isValid() const const
void setDate(QDate date, QDateTime::TransitionResolution resolve)
void setTime(QTime time, QDateTime::TransitionResolution resolve)
void setTimeZone(const QTimeZone &toZone, QDateTime::TransitionResolution resolve)
QList< T >::reference front()
bool isEmpty() const const
qsizetype size() const const
QDateTime toDateTime(const QString &string, QLocale::FormatType format, QCalendar cal, int baseYear) const const
QSet< T >::iterator begin()
bool isEmpty() const const
qsizetype size() const const
QList< T > values() const const
qsizetype count() const const
const QChar at(qsizetype position) const const
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
bool endsWith(QChar c, Qt::CaseSensitivity cs) const const
QString fromUtf8(QByteArrayView str)
qsizetype indexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
qsizetype length() const const
QString mid(qsizetype position, qsizetype n) &&
QString number(double n, char format, int precision)
QString & remove(QChar ch, Qt::CaseSensitivity cs)
QString & replace(QChar before, QChar after, Qt::CaseSensitivity cs)
qsizetype size() const const
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
bool startsWith(QChar c, Qt::CaseSensitivity cs) const const
double toDouble(bool *ok) const const
QString toUpper() const const
QString trimmed() const const
QTextStream & hex(QTextStream &stream)
QFuture< void > map(Iterator begin, Iterator end, MapFunctor &&function)
std::string toLower(std::string s)
String to lower case.
bool setHMS(int h, int m, int s, int ms)