Parcourir la source

AK+LibUnicode: Provide Unicode-aware String titlecase transformation

Timothy Flynn il y a 2 ans
Parent
commit
d6ddca0c0f
3 fichiers modifiés avec 33 ajouts et 2 suppressions
  1. 2 2
      AK/String.h
  2. 24 0
      Tests/AK/TestString.cpp
  3. 7 0
      Userland/Libraries/LibUnicode/String.cpp

+ 2 - 2
AK/String.h

@@ -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;

+ 24 - 0
Tests/AK/TestString.cpp

@@ -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));

+ 7 - 0
Userland/Libraries/LibUnicode/String.cpp

@@ -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();
+}
+
 }