QString QgsStringUtils::capitalize( const QString& string, QgsStringUtils::Capitalization capitalization ) { if ( string.isEmpty() ) return QString(); switch ( capitalization ) { case MixedCase: return string; case AllUppercase: return string.toUpper(); case AllLowercase: return string.toLower(); case ForceFirstLetterToCapital: { QString temp = string; QTextBoundaryFinder wordSplitter( QTextBoundaryFinder::Word, string.constData(), string.length(), 0, 0 ); QTextBoundaryFinder letterSplitter( QTextBoundaryFinder::Grapheme, string.constData(), string.length(), 0, 0 ); wordSplitter.setPosition( 0 ); bool first = true; while (( first && wordSplitter.boundaryReasons() & QTextBoundaryFinder::StartOfItem ) || wordSplitter.toNextBoundary() >= 0 ) { first = false; letterSplitter.setPosition( wordSplitter.position() ); letterSplitter.toNextBoundary(); QString substr = string.mid( wordSplitter.position(), letterSplitter.position() - wordSplitter.position() ); temp.replace( wordSplitter.position(), substr.length(), substr.toUpper() ); } return temp; } } // no warnings return string; }
QString QgsStringUtils::capitalize( const QString &string, QgsStringUtils::Capitalization capitalization ) { if ( string.isEmpty() ) return QString(); switch ( capitalization ) { case MixedCase: return string; case AllUppercase: return string.toUpper(); case AllLowercase: return string.toLower(); case ForceFirstLetterToCapital: { QString temp = string; QTextBoundaryFinder wordSplitter( QTextBoundaryFinder::Word, string.constData(), string.length(), nullptr, 0 ); QTextBoundaryFinder letterSplitter( QTextBoundaryFinder::Grapheme, string.constData(), string.length(), nullptr, 0 ); wordSplitter.setPosition( 0 ); bool first = true; while ( ( first && wordSplitter.boundaryReasons() & QTextBoundaryFinder::StartOfItem ) || wordSplitter.toNextBoundary() >= 0 ) { first = false; letterSplitter.setPosition( wordSplitter.position() ); letterSplitter.toNextBoundary(); QString substr = string.mid( wordSplitter.position(), letterSplitter.position() - wordSplitter.position() ); temp.replace( wordSplitter.position(), substr.length(), substr.toUpper() ); } return temp; } case TitleCase: { // yes, this is MASSIVELY simplifying the problem!! static QStringList smallWords; static QStringList newPhraseSeparators; static QRegularExpression splitWords; if ( smallWords.empty() ) { smallWords = QObject::tr( "a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|s|the|to|vs.|vs|via" ).split( '|' ); newPhraseSeparators = QObject::tr( ".|:" ).split( '|' ); splitWords = QRegularExpression( QStringLiteral( "\\b" ), QRegularExpression::UseUnicodePropertiesOption ); } const QStringList parts = string.split( splitWords, QString::SkipEmptyParts ); QString result; bool firstWord = true; int i = 0; int lastWord = parts.count() - 1; for ( const QString &word : qgis::as_const( parts ) ) { if ( newPhraseSeparators.contains( word.trimmed() ) ) { firstWord = true; result += word; } else if ( firstWord || ( i == lastWord ) || !smallWords.contains( word ) ) { result += word.at( 0 ).toUpper() + word.mid( 1 ); firstWord = false; } else { result += word; } i++; } return result; } } // no warnings return string; }