mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-28 11:49:44 +00:00
LibJS+LibUnicode: Implement retrieval of collator keyword values
Completely missed this when implementing Intl.Collator!
This commit is contained in:
parent
422d72e85d
commit
f091047159
Notes:
github-actions[bot]
2025-06-02 21:04:47 +00:00
Author: https://github.com/trflynn89
Commit: f091047159
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4970
3 changed files with 51 additions and 9 deletions
|
@ -54,12 +54,21 @@ describe("correct behavior", () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
test("collation", () => {
|
test("collation", () => {
|
||||||
// Only "default" collation is parsed for now.
|
const en1 = new Intl.Collator("en");
|
||||||
const en = new Intl.Collator("en");
|
expect(en1.resolvedOptions().locale).toBe("en");
|
||||||
expect(en.resolvedOptions().collation).toBe("default");
|
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" });
|
const el = new Intl.Collator("el", { collation: "foo" });
|
||||||
|
expect(el.resolvedOptions().locale).toBe("el");
|
||||||
expect(el.resolvedOptions().collation).toBe("default");
|
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", () => {
|
test("numeric may be set by locale extension", () => {
|
||||||
|
|
|
@ -26,7 +26,7 @@ describe("normal behavior", () => {
|
||||||
const values = Intl.supportedValuesOf("collation");
|
const values = Intl.supportedValuesOf("collation");
|
||||||
expect(isSorted(values)).toBeTrue();
|
expect(isSorted(values)).toBeTrue();
|
||||||
|
|
||||||
expect(values.indexOf("default")).not.toBe(-1);
|
expect(values.indexOf("emoji")).not.toBe(-1);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("currency", () => {
|
test("currency", () => {
|
||||||
|
|
|
@ -110,15 +110,48 @@ Vector<String> const& available_collation_numeric_orderings()
|
||||||
|
|
||||||
Vector<String> const& available_collations()
|
Vector<String> const& available_collations()
|
||||||
{
|
{
|
||||||
// FIXME: Implement this when we fully support Intl.Collator.
|
static auto collations = []() -> Vector<String> {
|
||||||
static Vector<String> collations { "default"_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;
|
return collations;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<String> available_collations(StringView)
|
Vector<String> available_collations(StringView locale)
|
||||||
{
|
{
|
||||||
// FIXME: Implement this when we fully support Intl.Collator.
|
UErrorCode status = U_ZERO_ERROR;
|
||||||
return available_collations();
|
|
||||||
|
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()
|
Vector<String> const& available_hour_cycles()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue