From e6a2ab1202e078360f8c19d393175a37fc822e4f Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Thu, 2 Sep 2021 18:21:42 -0400 Subject: [PATCH] LibUnicode: Generate an implementation of the Add Likely Subtags method --- .../LibUnicode/GenerateUnicodeLocale.cpp | 29 +++++++++++++++++-- Userland/Libraries/LibUnicode/Locale.cpp | 9 ++++++ Userland/Libraries/LibUnicode/Locale.h | 1 + 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp index bc9a3c5b57..1a2d68fb05 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp @@ -448,6 +448,8 @@ Optional resolve_variant_alias(StringView const& variant); Optional resolve_subdivision_alias(StringView const& subdivision); void resolve_complex_language_aliases(Unicode::LanguageID& language_id); + +Optional add_likely_subtags(Unicode::LanguageID const& language_id); Optional resolve_most_likely_territory(Unicode::LanguageID const& language_id); } @@ -671,7 +673,7 @@ static constexpr Array s_@name@ { { append_complex_mapping("likely_subtags"sv, locale_data.likely_subtags); generator.append(R"~~~( -static CanonicalLanguageID const* resolve_likely_subtag(Unicode::LanguageID const& language_id) +static LanguageMapping const* resolve_likely_subtag(Unicode::LanguageID const& language_id) { // https://unicode.org/reports/tr35/#Likely_Subtags enum class State { @@ -743,7 +745,7 @@ static CanonicalLanguageID const* resolve_likely_subtag(Unicode::LanguageID cons if (map.key.region != search_key.region) continue; - return &map.alias; + return ↦ } } @@ -893,10 +895,31 @@ void resolve_complex_language_aliases(Unicode::LanguageID& language_id) } } +Optional add_likely_subtags(Unicode::LanguageID const& language_id) +{ + // https://www.unicode.org/reports/tr35/#Likely_Subtags + auto const* likely_subtag = resolve_likely_subtag(language_id); + if (likely_subtag == nullptr) + return {}; + + auto maximized = language_id; + auto const& key = likely_subtag->key; + auto const& alias = likely_subtag->alias; + + if (maximized.language == "und"sv) + maximized.language = alias.language; + if (!maximized.script.has_value() || (!key.script.is_empty() && !alias.script.is_empty())) + maximized.script = alias.script; + if (!maximized.region.has_value() || (!key.region.is_empty() && !alias.region.is_empty())) + maximized.region = alias.region; + + return maximized; +} + Optional resolve_most_likely_territory(Unicode::LanguageID const& language_id) { if (auto const* likely_subtag = resolve_likely_subtag(language_id); likely_subtag != nullptr) - return likely_subtag->region; + return likely_subtag->alias.region; return {}; } diff --git a/Userland/Libraries/LibUnicode/Locale.cpp b/Userland/Libraries/LibUnicode/Locale.cpp index 8990f65e04..e1714299ae 100644 --- a/Userland/Libraries/LibUnicode/Locale.cpp +++ b/Userland/Libraries/LibUnicode/Locale.cpp @@ -834,6 +834,15 @@ Optional resolve_subdivision_alias(StringView subdivision) #endif } +Optional add_likely_subtags([[maybe_unused]] LanguageID const& language_id) +{ +#if ENABLE_UNICODE_DATA + return Detail::add_likely_subtags(language_id); +#else + return {}; +#endif +} + String resolve_most_likely_territory([[maybe_unused]] LanguageID const& language_id, StringView territory_alias) { auto aliases = territory_alias.split_view(' '); diff --git a/Userland/Libraries/LibUnicode/Locale.h b/Userland/Libraries/LibUnicode/Locale.h index 7435ba8ca2..08498026ae 100644 --- a/Userland/Libraries/LibUnicode/Locale.h +++ b/Userland/Libraries/LibUnicode/Locale.h @@ -130,6 +130,7 @@ Optional resolve_script_tag_alias(StringView script_tag); Optional resolve_variant_alias(StringView variant); Optional resolve_subdivision_alias(StringView subdivision); +Optional add_likely_subtags(LanguageID const& language_id); String resolve_most_likely_territory(LanguageID const& language_id, StringView territory_alias); }