23 #include <string_view>
27 #include <rtl/character.hxx>
28 #include <rtl/ustring.hxx>
29 #include <rtl/ustrbuf.hxx>
30 #include <rtl/string.hxx>
31 #include <rtl/strbuf.hxx>
38 #include <com/sun/star/i18n/BreakIterator.hpp>
39 #include <com/sun/star/i18n/CharType.hpp>
40 #include <com/sun/star/i18n/Collator.hpp>
47 template <
typename T,
typename C> T tmpl_stripStart(
const T &rIn,
53 typename T::size_type
i = 0;
55 while (i < rIn.size())
57 if (rIn[i] != cRemove)
64 template <
typename T,
typename C> T tmpl_stripStartString(
const T &rIn,
72 while (i < rIn.getLength())
74 if (rIn[i] != cRemove)
85 return tmpl_stripStartString<OString, char>(rIn, c);
88 std::string_view
stripStart(std::string_view rIn,
char c)
90 return tmpl_stripStart<std::string_view, char>(rIn, c);
95 return tmpl_stripStartString<OUString, sal_Unicode>(rIn, c);
100 return tmpl_stripStart<std::u16string_view, sal_Unicode>(rIn, c);
105 template <
typename T,
typename C> T tmpl_stripEnd(
const T &rIn,
111 typename T::size_type i = rIn.size();
115 if (rIn[i-1] != cRemove)
120 return rIn.substr(0, i);
122 template <
typename T,
typename C> T tmpl_stripEndString(
const T &rIn,
128 sal_Int32 i = rIn.getLength();
132 if (rIn[i-1] != cRemove)
137 return rIn.copy(0, i);
143 return tmpl_stripEndString<OString, char>(rIn, c);
146 std::string_view
stripEnd(std::string_view rIn,
char c)
148 return tmpl_stripEnd<std::string_view, char>(rIn, c);
153 return tmpl_stripEndString<OUString, sal_Unicode>(rIn, c);
158 return tmpl_stripEnd<std::u16string_view, sal_Unicode>(rIn, c);
161 OString
strip(
const OString& rIn,
char c)
163 auto x = tmpl_stripStartString<OString, char>(rIn, c);
167 std::string_view
strip(std::string_view rIn,
char c)
169 auto x = tmpl_stripStart<std::string_view, char>(rIn, c);
175 auto x = tmpl_stripStartString<OUString, sal_Unicode>(rIn, c);
181 auto x = tmpl_stripStart<std::u16string_view, sal_Unicode>(rIn, c);
187 template <
typename T,
typename C> sal_Int32 tmpl_getTokenCount( T rIn,
194 sal_Int32 nTokCount = 1;
195 for (
typename T::size_type i = 0; i < rIn.size(); ++i)
206 return tmpl_getTokenCount<std::string_view, char>(rIn, cTok);
211 return tmpl_getTokenCount<std::u16string_view, sal_Unicode>(rIn, cTok);
215 OUString
const & str, sal_Int32 nStart, sal_Int32 nLength )
218 for( sal_Int32 i = nStart; i < nStart + nLength; )
220 sal_uInt32 c = str.iterateCodePoints(&i);
221 sal_uInt32
value = 0;
224 else if( c >= 0x1D7F6 )
226 else if( c >= 0x1D7EC )
228 else if( c >= 0x1D7E2 )
230 else if( c >= 0x1D7D8 )
232 else if( c >= 0x1D7CE )
234 else if( c >= 0x11066 )
236 else if( c >= 0x104A0 )
238 else if( c >= 0xFF10 )
240 else if( c >= 0xABF0 )
242 else if( c >= 0xAA50 )
244 else if( c >= 0xA9D0 )
246 else if( c >= 0xA900 )
248 else if( c >= 0xA8D0 )
250 else if( c >= 0xA620 )
252 else if( c >= 0x1C50 )
254 else if( c >= 0x1C40 )
256 else if( c >= 0x1BB0 )
258 else if( c >= 0x1B50 )
260 else if( c >= 0x1A90 )
262 else if( c >= 0x1A80 )
264 else if( c >= 0x19D0 )
266 else if( c >= 0x1946 )
268 else if( c >= 0x1810 )
270 else if( c >= 0x17E0 )
272 else if( c >= 0x1090 )
274 else if( c >= 0x1040 )
276 else if( c >= 0x0F20 )
278 else if( c >= 0x0ED0 )
280 else if( c >= 0x0E50 )
282 else if( c >= 0x0D66 )
284 else if( c >= 0x0CE6 )
286 else if( c >= 0x0C66 )
288 else if( c >= 0x0BE6 )
290 else if( c >= 0x0B66 )
292 else if( c >= 0x0AE6 )
294 else if( c >= 0x0A66 )
296 else if( c >= 0x09E6 )
298 else if( c >= 0x0966 )
300 else if( c >= 0x07C0 )
302 else if( c >= 0x06F0 )
304 else if( c >= 0x0660 )
306 result = result * 10 + value;
312 OUString
const & str )
322 uno::Sequence< OUString >
const& i_rSeq)
327 return buf.makeStringAndClear();
332 std::u16string_view pStr,
337 assert(nIndex <= static_cast<sal_Int32>(pStr.size()));
341 if (nIndex >= 0 && nToken >= 0)
343 const auto* pOrgCharStr = pStr.data();
344 const auto* pCharStr = pOrgCharStr + nIndex;
345 sal_Int32 nLen = pStr.size() - nIndex;
346 sal_Int32 nTokCount = 0;
347 const auto* pCharStrStart = pCharStr;
350 if (*pCharStr == cTok)
354 if (nTokCount > nToken)
356 if (nTokCount == nToken)
357 pCharStrStart = pCharStr + 1;
363 if (nTokCount >= nToken)
365 ppThis = OUString(pCharStrStart, pCharStr - pCharStrStart);
367 return pCharStr - pOrgCharStr + 1;
377 std::vector<OUString>
380 std::vector< OUString > vec;
385 idx =
getToken(kw, rStr, 0, cSeparator, idx);
397 uno::Sequence< OUString >
400 std::vector< OUString > vec =
split(i_rString,
',');
404 OString
join(std::string_view rSeparator,
const std::vector<OString>& rSequence)
407 for (
size_t i = 0; i < rSequence.size(); ++i)
410 aBuffer.append(rSeparator);
411 aBuffer.append(rSequence[i]);
413 return aBuffer.makeStringAndClear();
417 const uno::Reference< i18n::XCollator > &rCollator,
418 const uno::Reference< i18n::XBreakIterator > &rBI,
419 const lang::Locale &rLocale )
423 sal_Int32 nLHSLastNonDigitPos = 0;
424 sal_Int32 nRHSLastNonDigitPos = 0;
425 sal_Int32 nLHSFirstDigitPos = 0;
426 sal_Int32 nRHSFirstDigitPos = 0;
428 while (nLHSFirstDigitPos < rLHS.getLength() || nRHSFirstDigitPos < rRHS.getLength())
430 sal_Int32 nLHSChunkLen;
431 sal_Int32 nRHSChunkLen;
434 nLHSFirstDigitPos = rBI->nextCharBlock(rLHS, nLHSLastNonDigitPos,
435 rLocale, i18n::CharType::DECIMAL_DIGIT_NUMBER);
436 nRHSFirstDigitPos = rBI->nextCharBlock(rRHS, nRHSLastNonDigitPos,
437 rLocale, i18n::CharType::DECIMAL_DIGIT_NUMBER);
438 if (nLHSFirstDigitPos == -1)
439 nLHSFirstDigitPos = rLHS.getLength();
440 if (nRHSFirstDigitPos == -1)
441 nRHSFirstDigitPos = rRHS.getLength();
442 nLHSChunkLen = nLHSFirstDigitPos - nLHSLastNonDigitPos;
443 nRHSChunkLen = nRHSFirstDigitPos - nRHSLastNonDigitPos;
445 nRet = rCollator->compareSubstring(rLHS, nLHSLastNonDigitPos,
446 nLHSChunkLen, rRHS, nRHSLastNonDigitPos, nRHSChunkLen);
451 nLHSLastNonDigitPos = rBI->endOfCharBlock(rLHS, nLHSFirstDigitPos,
452 rLocale, i18n::CharType::DECIMAL_DIGIT_NUMBER);
453 nRHSLastNonDigitPos = rBI->endOfCharBlock(rRHS, nRHSFirstDigitPos,
454 rLocale, i18n::CharType::DECIMAL_DIGIT_NUMBER);
455 if (nLHSLastNonDigitPos == -1)
456 nLHSLastNonDigitPos = rLHS.getLength();
457 if (nRHSLastNonDigitPos == -1)
458 nRHSLastNonDigitPos = rRHS.getLength();
459 nLHSChunkLen = nLHSLastNonDigitPos - nLHSFirstDigitPos;
460 nRHSChunkLen = nRHSLastNonDigitPos - nRHSFirstDigitPos;
471 nRet = (nLHS < nRHS) ? -1 : 1;
480 const uno::Reference< uno::XComponentContext > &rContext,
481 const lang::Locale &rLocale) :
m_aLocale(rLocale)
485 m_xBI = i18n::BreakIterator::create( rContext );
491 rString.data(), rString.data() + rString.size(),
492 [](
unsigned char c){
return rtl::isAsciiDigit(c); });
498 rString.data(), rString.data() + rString.size(),
499 [](
sal_Unicode c){
return rtl::isAsciiDigit(c); });
504 template <
typename T,
typename I,
typename O> T tmpl_reverseString(I rIn)
509 typename I::size_type i = rIn.size();
510 O sBuf(static_cast<sal_Int32>(i));
512 sBuf.append(rIn[--i]);
513 return sBuf.makeStringAndClear();
519 return tmpl_reverseString<OUString, std::u16string_view, OUStringBuffer>(rStr);
524 return tmpl_reverseString<OString, std::string_view, OStringBuffer>(rStr);
528 sal_Unicode const*
const pChars, sal_Int32
const nPos)
530 for (std::u16string_view::size_type i = nPos; i < rIn.size(); ++i)
549 for (std::u16string_view::size_type i = 0; i < rIn.size(); ++i)
567 buf.append(rIn.substr(0, i));
577 return isFound ? buf.makeStringAndClear() : OUString(rIn);
581 std::u16string_view rNewToken)
583 sal_Int32 nLen = rIn.getLength();
585 sal_Int32 nFirstChar = 0;
598 else if (nTok > nToken)
606 return rIn.replaceAt(nFirstChar, i-nFirstChar, rNewToken);
OString stripEnd(const OString &rIn, char c)
Strips occurrences of a character from the end of the source string.
css::lang::Locale const m_aLocale
std::vector< OUString > split(std::u16string_view rStr, sal_Unicode cSeparator)
bool isdigitAsciiString(std::string_view rString)
Determine if an OString contains solely ASCII numeric digits.
OutputIter intersperse(ForwardIter start, ForwardIter end, OutputIter out, T const &separator)
algorithm similar to std::copy, but inserts a separator between elements.
OString join(std::string_view rSeparator, const std::vector< OString > &rSequence)
Return a string which is the concatenation of the strings in the sequence.
OUString removeAny(std::u16string_view rIn, sal_Unicode const *const pChars)
Remove any of a list of code units in the string.
sal_Int32 getTokenCount(std::string_view rIn, char cTok)
Returns number of tokens in an OUString.
css::uno::Reference< css::i18n::XBreakIterator > m_xBI
sal_Int32 compareNatural(const OUString &rLHS, const OUString &rRHS, const uno::Reference< i18n::XCollator > &rCollator, const uno::Reference< i18n::XBreakIterator > &rBI, const lang::Locale &rLocale)
NaturalStringSorter(const css::uno::Reference< css::uno::XComponentContext > &rContext, const css::lang::Locale &rLocale)
output iterator that appends OUStrings into an OUStringBuffer.
sal_Int32 indexOfAny(std::u16string_view rIn, sal_Unicode const *const pChars, sal_Int32 const nPos)
Find any of a list of code units in the string.
static sal_uInt32 decimalStringToNumber(OUString const &str, sal_Int32 nStart, sal_Int32 nLength)
std::unique_ptr< char[]> aBuffer
css::uno::Sequence< DstElementType > containerToSequence(const SrcType &i_Container)
Copy from a container into a Sequence.
OString strip(const OString &rIn, char c)
Strips occurrences of a character from the start and end of the source string.
OUString setToken(const OUString &rIn, sal_Int32 nToken, sal_Unicode cTok, std::u16string_view rNewToken)
Replace a token in a string.
OString stripStart(const OString &rIn, char c)
Strips occurrences of a character from the start of the source string.
static sal_Int32 getToken(OUString &ppThis, std::u16string_view pStr, sal_Int32 nToken, sal_Unicode cTok, sal_Int32 nIndex)
OUString reverseString(std::u16string_view rStr)
Reverse an OUString.
OUString convertCommaSeparated(uno::Sequence< OUString > const &i_rSeq)
css::uno::Reference< css::i18n::XCollator > m_xCollator