static unsigned leftTruncateToBuffer(const String& string, unsigned length, unsigned keepCount, UChar* buffer, bool shouldInsertEllipsis) { ASSERT(keepCount < length); ASSERT(keepCount < STRING_BUFFER_SIZE); unsigned startIndex = length - keepCount; NonSharedCharacterBreakIterator it(string); unsigned adjustedStartIndex = startIndex; startIndex = boundedTextBreakFollowing(it, startIndex, length - startIndex); // Strip single character after ellipsis character, when that character is preceded by a space if (adjustedStartIndex < length && string[adjustedStartIndex] != space && adjustedStartIndex < length - 1 && string[adjustedStartIndex + 1] == space) ++adjustedStartIndex; // Strip whitespace after the ellipsis character while (adjustedStartIndex < length && string[adjustedStartIndex] == space) ++adjustedStartIndex; if (shouldInsertEllipsis) { buffer[0] = horizontalEllipsis; StringView(string).substring(adjustedStartIndex, length - adjustedStartIndex + 1).getCharactersWithUpconvert(&buffer[1]); return length - adjustedStartIndex + 1; } StringView(string).substring(adjustedStartIndex, length - adjustedStartIndex + 1).getCharactersWithUpconvert(&buffer[0]); return length - adjustedStartIndex; }
static unsigned centerTruncateToBuffer(const String& string, unsigned length, unsigned keepCount, UChar* buffer) { ASSERT(keepCount < length); ASSERT(keepCount < STRING_BUFFER_SIZE); unsigned omitStart = (keepCount + 1) / 2; TextBreakIterator* it = characterBreakIterator(string.characters(), length); unsigned omitEnd = boundedTextBreakFollowing(it, omitStart + (length - keepCount) - 1, length); omitStart = textBreakAtOrPreceding(it, omitStart); unsigned truncatedLength = omitStart + 1 + (length - omitEnd); ASSERT(truncatedLength <= length); memcpy(buffer, string.characters(), sizeof(UChar) * omitStart); buffer[omitStart] = horizontalEllipsis; memcpy(&buffer[omitStart + 1], &string.characters()[omitEnd], sizeof(UChar) * (length - omitEnd)); return truncatedLength; }
static unsigned centerTruncateToBuffer(const String& string, unsigned length, unsigned keepCount, UChar* buffer) { ASSERT(keepCount < length); ASSERT(keepCount < STRING_BUFFER_SIZE); unsigned omitStart = (keepCount + 1) / 2; NonSharedCharacterBreakIterator it(string); unsigned omitEnd = boundedTextBreakFollowing(it, omitStart + (length - keepCount) - 1, length); omitStart = textBreakAtOrPreceding(it, omitStart); unsigned truncatedLength = omitStart + 1 + (length - omitEnd); ASSERT(truncatedLength <= length); string.copyTo(buffer, 0, omitStart); buffer[omitStart] = horizontalEllipsis; string.copyTo(&buffer[omitStart + 1], omitEnd, length - omitEnd); return truncatedLength; }
static unsigned centerTruncateToBuffer(const String& string, unsigned length, unsigned keepCount, UChar* buffer, bool shouldInsertEllipsis) { ASSERT_WITH_SECURITY_IMPLICATION(keepCount < length); ASSERT_WITH_SECURITY_IMPLICATION(keepCount < STRING_BUFFER_SIZE); unsigned omitStart = (keepCount + 1) / 2; NonSharedCharacterBreakIterator it(StringView(string).substring(0, length)); unsigned omitEnd = boundedTextBreakFollowing(it, omitStart + (length - keepCount) - 1, length); omitStart = textBreakAtOrPreceding(it, omitStart); #if PLATFORM(IOS) // FIXME: We should guard this code behind an editing behavior. Then we can remove the PLATFORM(IOS)-guard. // Or just turn it on for all platforms. It seems like good behavior everywhere. Might be better to generalize // it to handle all whitespace, not just "space". // Strip single character before ellipsis character, when that character is preceded by a space if (omitStart > 1 && string[omitStart - 1] != space && omitStart > 2 && string[omitStart - 2] == space) --omitStart; // Strip whitespace before and after the ellipsis character while (omitStart > 1 && string[omitStart - 1] == space) --omitStart; // Strip single character after ellipsis character, when that character is followed by a space if ((length - omitEnd) > 1 && string[omitEnd] != space && (length - omitEnd) > 2 && string[omitEnd + 1] == space) ++omitEnd; while ((length - omitEnd) > 1 && string[omitEnd] == space) ++omitEnd; #endif unsigned truncatedLength = omitStart + shouldInsertEllipsis + (length - omitEnd); ASSERT(truncatedLength <= length); StringView(string).substring(0, omitStart).getCharactersWithUpconvert(buffer); if (shouldInsertEllipsis) buffer[omitStart++] = horizontalEllipsis; StringView(string).substring(omitEnd, length - omitEnd).getCharactersWithUpconvert(&buffer[omitStart]); return truncatedLength; }