TextBreakIterator.cpp [plain text]
#include "config.h"
#include "TextBreakIterator.h"
namespace WebCore {
unsigned numGraphemeClusters(const String& s)
{
unsigned stringLength = s.length();
if (!stringLength)
return 0;
if (s.is8Bit() && !s.contains('\r'))
return stringLength;
NonSharedCharacterBreakIterator it(s.characters(), stringLength);
if (!it)
return stringLength;
unsigned num = 0;
while (textBreakNext(it) != TextBreakDone)
++num;
return num;
}
unsigned numCharactersInGraphemeClusters(const String& s, unsigned numGraphemeClusters)
{
unsigned stringLength = s.length();
if (!stringLength)
return 0;
if (s.is8Bit() && !s.contains('\r'))
return std::min(stringLength, numGraphemeClusters);
NonSharedCharacterBreakIterator it(s.characters(), stringLength);
if (!it)
return std::min(stringLength, numGraphemeClusters);
for (unsigned i = 0; i < numGraphemeClusters; ++i) {
if (textBreakNext(it) == TextBreakDone)
return stringLength;
}
return textBreakCurrent(it);
}
#if !USE(ICU_UNICODE)
TextBreakIterator* acquireLineBreakIterator(const LChar* string, int length, const AtomicString& locale, const UChar* priorContext, unsigned priorContextLength)
{
Vector<UChar> utf16string(length);
for (int i = 0; i < length; ++i)
utf16string[i] = string[i];
return acquireLineBreakIterator(utf16string.data(), length, locale, priorContext, priorContextLength);
}
#endif
}