mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 15:38:10 +00:00
LibUnicode: Implement the Remove Likely Subtags method
Unlike Add Likely Subtags, this method doesn't require generated data. Instead, it is defined in terms of Add Likely Subtags.
This commit is contained in:
parent
0b1f5118d5
commit
a77f323dfb
2 changed files with 48 additions and 0 deletions
|
@ -843,6 +843,52 @@ Optional<LanguageID> add_likely_subtags([[maybe_unused]] LanguageID const& langu
|
|||
#endif
|
||||
}
|
||||
|
||||
Optional<LanguageID> remove_likely_subtags([[maybe_unused]] LanguageID const& language_id)
|
||||
{
|
||||
#if ENABLE_UNICODE_DATA
|
||||
// https://www.unicode.org/reports/tr35/#Likely_Subtags
|
||||
auto return_language_and_variants = [](auto language, auto variants) {
|
||||
language.variants = move(variants);
|
||||
return language;
|
||||
};
|
||||
|
||||
// 1. First get max = AddLikelySubtags(inputLocale). If an error is signaled, return it.
|
||||
auto maximized = add_likely_subtags(language_id);
|
||||
if (!maximized.has_value())
|
||||
return {};
|
||||
|
||||
// 2. Remove the variants from max.
|
||||
auto variants = move(maximized->variants);
|
||||
|
||||
// 3. Get the components of the max (languagemax, scriptmax, regionmax).
|
||||
auto language_max = maximized->language;
|
||||
auto script_max = maximized->script;
|
||||
auto region_max = maximized->region;
|
||||
|
||||
// 4. Then for trial in {languagemax, languagemax_regionmax, languagemax_scriptmax}:
|
||||
// If AddLikelySubtags(trial) = max, then return trial + variants.
|
||||
auto run_trial = [&](Optional<String> language, Optional<String> script, Optional<String> region) -> Optional<LanguageID> {
|
||||
LanguageID trial { .language = move(language), .script = move(script), .region = move(region) };
|
||||
|
||||
if (add_likely_subtags(trial) == maximized)
|
||||
return return_language_and_variants(move(trial), move(variants));
|
||||
return {};
|
||||
};
|
||||
|
||||
if (auto trial = run_trial(language_max, {}, {}); trial.has_value())
|
||||
return trial;
|
||||
if (auto trial = run_trial(language_max, {}, region_max); trial.has_value())
|
||||
return trial;
|
||||
if (auto trial = run_trial(language_max, script_max, {}); trial.has_value())
|
||||
return trial;
|
||||
|
||||
// 5. If you do not get a match, return max + variants.
|
||||
return return_language_and_variants(maximized.release_value(), move(variants));
|
||||
#else
|
||||
return {};
|
||||
#endif
|
||||
}
|
||||
|
||||
String resolve_most_likely_territory([[maybe_unused]] LanguageID const& language_id, StringView territory_alias)
|
||||
{
|
||||
auto aliases = territory_alias.split_view(' ');
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue