mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 12:38:12 +00:00
LibUnicode: Generate a list of available plural categories per locale
Separate lists are generated for cardinal and ordinal form.
This commit is contained in:
parent
ea78bac36d
commit
8aeacccd82
3 changed files with 52 additions and 0 deletions
|
@ -503,6 +503,21 @@ static constexpr Array<PluralCategoryFunction, @size@> s_@form@_functions { {)~~
|
||||||
)~~~");
|
)~~~");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
auto append_categories = [&](auto const& name, auto const& rules) {
|
||||||
|
generator.set("name", name);
|
||||||
|
generator.set("size", String::number(rules.size() + 1));
|
||||||
|
|
||||||
|
generator.append(R"~~~(
|
||||||
|
static constexpr Array<PluralCategory, @size@> @name@ { { PluralCategory::Other)~~~");
|
||||||
|
|
||||||
|
for (auto [category, condition] : rules) {
|
||||||
|
generator.set("category"sv, format_identifier({}, category));
|
||||||
|
generator.append(", PluralCategory::@category@"sv);
|
||||||
|
}
|
||||||
|
|
||||||
|
generator.append("} };");
|
||||||
|
};
|
||||||
|
|
||||||
append_string_conversions("PluralCategory"sv, "plural_category"sv, locale_data.categories);
|
append_string_conversions("PluralCategory"sv, "plural_category"sv, locale_data.categories);
|
||||||
|
|
||||||
for (auto [locale, rules] : locale_data.locales) {
|
for (auto [locale, rules] : locale_data.locales) {
|
||||||
|
@ -513,6 +528,18 @@ static constexpr Array<PluralCategoryFunction, @size@> s_@form@_functions { {)~~
|
||||||
append_lookup_table("cardinal"sv);
|
append_lookup_table("cardinal"sv);
|
||||||
append_lookup_table("ordinal"sv);
|
append_lookup_table("ordinal"sv);
|
||||||
|
|
||||||
|
generate_mapping(generator, locales, "PluralCategory"sv, "s_cardinal_categories"sv, "s_cardinal_categories_{}", format_identifier,
|
||||||
|
[&](auto const& name, auto const& locale) {
|
||||||
|
auto& rules = locale_data.locales.find(locale)->value;
|
||||||
|
append_categories(name, rules.rules_for_form("cardinal"sv));
|
||||||
|
});
|
||||||
|
|
||||||
|
generate_mapping(generator, locales, "PluralCategory"sv, "s_ordinal_categories"sv, "s_ordinal_categories_{}", format_identifier,
|
||||||
|
[&](auto const& name, auto const& locale) {
|
||||||
|
auto& rules = locale_data.locales.find(locale)->value;
|
||||||
|
append_categories(name, rules.rules_for_form("ordinal"sv));
|
||||||
|
});
|
||||||
|
|
||||||
generator.append(R"~~~(
|
generator.append(R"~~~(
|
||||||
PluralCategory determine_plural_category(StringView locale, PluralForm form, PluralOperands operands)
|
PluralCategory determine_plural_category(StringView locale, PluralForm form, PluralOperands operands)
|
||||||
{
|
{
|
||||||
|
@ -535,6 +562,24 @@ PluralCategory determine_plural_category(StringView locale, PluralForm form, Plu
|
||||||
return decider(move(operands));
|
return decider(move(operands));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Span<PluralCategory const> available_plural_categories(StringView locale, PluralForm form)
|
||||||
|
{
|
||||||
|
auto locale_value = locale_from_string(locale);
|
||||||
|
if (!locale_value.has_value())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
auto locale_index = to_underlying(*locale_value) - 1; // Subtract 1 because 0 == Locale::None.
|
||||||
|
|
||||||
|
switch (form) {
|
||||||
|
case PluralForm::Cardinal:
|
||||||
|
return s_cardinal_categories[locale_index];
|
||||||
|
case PluralForm::Ordinal:
|
||||||
|
return s_ordinal_categories[locale_index];
|
||||||
|
}
|
||||||
|
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
)~~~");
|
)~~~");
|
||||||
|
|
||||||
|
|
|
@ -56,4 +56,10 @@ PluralCategory __attribute__((weak)) determine_plural_category(StringView, Plura
|
||||||
return PluralCategory::Other;
|
return PluralCategory::Other;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Span<PluralCategory const> __attribute__((weak)) available_plural_categories(StringView, PluralForm)
|
||||||
|
{
|
||||||
|
static constexpr Array<PluralCategory, 1> categories { { PluralCategory::Other } };
|
||||||
|
return categories.span();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,5 +61,6 @@ Optional<PluralCategory> plural_category_from_string(StringView category);
|
||||||
StringView plural_category_to_string(PluralCategory category);
|
StringView plural_category_to_string(PluralCategory category);
|
||||||
|
|
||||||
PluralCategory determine_plural_category(StringView locale, PluralForm form, PluralOperands operands);
|
PluralCategory determine_plural_category(StringView locale, PluralForm form, PluralOperands operands);
|
||||||
|
Span<PluralCategory const> available_plural_categories(StringView locale, PluralForm form);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue