1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-09 09:34:57 +09:00

LibJS+LibUnicode: Implement retrieval of collator keyword values

Completely missed this when implementing Intl.Collator!
This commit is contained in:
Timothy Flynn 2025-06-02 14:35:12 -04:00 committed by Shannon Booth
parent 422d72e85d
commit f091047159
Notes: github-actions[bot] 2025-06-02 21:04:47 +00:00
3 changed files with 51 additions and 9 deletions

View file

@ -54,12 +54,21 @@ describe("correct behavior", () => {
});
test("collation", () => {
// Only "default" collation is parsed for now.
const en = new Intl.Collator("en");
expect(en.resolvedOptions().collation).toBe("default");
const en1 = new Intl.Collator("en");
expect(en1.resolvedOptions().locale).toBe("en");
expect(en1.resolvedOptions().collation).toBe("default");
const en2 = new Intl.Collator("en-u-co-phonebk", { collation: "pinyin" });
expect(en2.resolvedOptions().locale).toBe("en");
expect(en2.resolvedOptions().collation).toBe("default");
const el = new Intl.Collator("el", { collation: "foo" });
expect(el.resolvedOptions().locale).toBe("el");
expect(el.resolvedOptions().collation).toBe("default");
const de = new Intl.Collator("de-u-co-phonebk", { collation: "pinyin" });
expect(de.resolvedOptions().locale).toBe("de-u-co-phonebk");
expect(de.resolvedOptions().collation).toBe("phonebk");
});
test("numeric may be set by locale extension", () => {

View file

@ -26,7 +26,7 @@ describe("normal behavior", () => {
const values = Intl.supportedValuesOf("collation");
expect(isSorted(values)).toBeTrue();
expect(values.indexOf("default")).not.toBe(-1);
expect(values.indexOf("emoji")).not.toBe(-1);
});
test("currency", () => {

View file

@ -110,15 +110,48 @@ Vector<String> const& available_collation_numeric_orderings()
Vector<String> const& available_collations()
{
// FIXME: Implement this when we fully support Intl.Collator.
static Vector<String> collations { "default"_string };
static auto collations = []() -> Vector<String> {
UErrorCode status = U_ZERO_ERROR;
auto keywords = adopt_own_if_nonnull(icu::Collator::getKeywordValues("collation", status));
if (icu_failure(status))
return {};
auto collations = icu_string_enumeration_to_list(move(keywords), "co", [](char const* value, size_t value_length) {
// https://tc39.es/ecma402/#sec-properties-of-intl-collator-instances
// the values "standard" and "search" are not allowed
return !StringView { value, value_length }.is_one_of("standard"sv, "search"sv);
});
quick_sort(collations);
return collations;
}();
return collations;
}
Vector<String> available_collations(StringView)
Vector<String> available_collations(StringView locale)
{
// FIXME: Implement this when we fully support Intl.Collator.
return available_collations();
UErrorCode status = U_ZERO_ERROR;
auto locale_data = LocaleData::for_locale(locale);
if (!locale_data.has_value())
return {};
auto keywords = adopt_own_if_nonnull(icu::Collator::getKeywordValuesForLocale("collation", locale_data->locale(), true, status));
if (icu_failure(status))
return {};
auto collations = icu_string_enumeration_to_list(move(keywords), "co", [](char const* value, size_t value_length) {
// https://tc39.es/ecma402/#sec-properties-of-intl-collator-instances
// the values "standard" and "search" are not allowed
return !StringView { value, value_length }.is_one_of("standard"sv, "search"sv);
});
if (!collations.contains_slow("default"sv))
collations.prepend("default"_string);
return collations;
}
Vector<String> const& available_hour_cycles()