AK+LibUnicode: Provide Unicode-aware String titlecase transformation

This commit is contained in:
Timothy Flynn 2023-01-16 11:28:27 -05:00 committed by Tim Flynn
parent bc51017a03
commit d6ddca0c0f
Notes: sideshowbarker 2024-07-17 01:36:17 +09:00
3 changed files with 33 additions and 2 deletions

View file

@ -45,10 +45,10 @@ public:
// Creates a new String from a sequence of UTF-8 encoded code points.
static ErrorOr<String> from_utf8(StringView);
// Creates a new String by transforming this String to lower- or uppercase. Using these methods
// require linking LibUnicode into your application.
// Creates a new String by case-transforming this String. Using these methods require linking LibUnicode into your application.
ErrorOr<String> to_lowercase(Optional<StringView> const& locale = {}) const;
ErrorOr<String> to_uppercase(Optional<StringView> const& locale = {}) const;
ErrorOr<String> to_titlecase(Optional<StringView> const& locale = {}) const;
// Creates a substring with a deep copy of the specified data window.
ErrorOr<String> substring_from_byte_offset(size_t start, size_t byte_count) const;

View file

@ -163,6 +163,30 @@ TEST_CASE(to_uppercase)
}
}
TEST_CASE(to_titlecase)
{
{
auto string = MUST(String::from_utf8("foo bar baz"sv));
auto result = MUST(string.to_titlecase());
EXPECT_EQ(result, "Foo Bar Baz"sv);
}
{
auto string = MUST(String::from_utf8("foo \n \r bar \t baz"sv));
auto result = MUST(string.to_titlecase());
EXPECT_EQ(result, "Foo \n \r Bar \t Baz"sv);
}
{
auto string = MUST(String::from_utf8("f\"oo\" b'ar'"sv));
auto result = MUST(string.to_titlecase());
EXPECT_EQ(result, "F\"Oo\" B'Ar'"sv);
}
{
auto string = MUST(String::from_utf8("123dollars"sv));
auto result = MUST(string.to_titlecase());
EXPECT_EQ(result, "123Dollars"sv);
}
}
TEST_CASE(is_one_of)
{
auto foo = MUST(String::from_utf8("foo"sv));

View file

@ -26,4 +26,11 @@ ErrorOr<String> String::to_uppercase(Optional<StringView> const& locale) const
return builder.to_string();
}
ErrorOr<String> String::to_titlecase(Optional<StringView> const& locale) const
{
StringBuilder builder;
TRY(Unicode::Detail::build_titlecase_string(code_points(), builder, locale));
return builder.to_string();
}
}