From 88504b89e19d1e777d3c3075487c261111f32aaf Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Fri, 2 Sep 2022 11:48:05 -0400 Subject: [PATCH] LibLocale: Rename a couple CLDR generator structures When LibLocale is placed in the Locale namespace, this will conflict with the Locale structure in each CLDR generator. Rename this to "LocaleData", and rename its parent UnicodeLocaleData to just "CLDR" to avoid confusion between LocaleData and UnicodeLocaleData. --- .../LibLocale/GenerateDateTimeFormatData.cpp | 314 +++++------ .../LibLocale/GenerateLocaleData.cpp | 498 +++++++++--------- .../LibLocale/GenerateNumberFormatData.cpp | 146 ++--- .../LibLocale/GeneratePluralRulesData.cpp | 60 +-- .../GenerateRelativeTimeFormatData.cpp | 46 +- 5 files changed, 532 insertions(+), 532 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp index ec6fa40df5..47eed1bd96 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp @@ -534,7 +534,7 @@ struct AK::Formatter : Formatter { } }; -struct Locale { +struct LocaleData { HashMap calendars; TimeZoneNamesListIndexType time_zones { 0 }; @@ -543,7 +543,7 @@ struct Locale { DayPeriodListIndexType day_periods { 0 }; }; -struct UnicodeLocaleData { +struct CLDR { UniqueStringStorage unique_strings; UniqueStorage unique_patterns; UniqueStorage unique_pattern_lists; @@ -561,7 +561,7 @@ struct UnicodeLocaleData { UniqueStorage unique_day_period_lists; UniqueStorage unique_hour_cycle_lists; - HashMap locales; + HashMap locales; HashMap hour_cycles; Vector hour_cycle_regions; @@ -611,7 +611,7 @@ static Optional day_period_from_string(StringView day_period return {}; } -static ErrorOr parse_hour_cycles(String core_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_hour_cycles(String core_path, CLDR& cldr) { // https://unicode.org/reports/tr35/tr35-dates.html#Time_Data LexicalPath time_data_path(move(core_path)); @@ -645,17 +645,17 @@ static ErrorOr parse_hour_cycles(String core_path, UnicodeLocaleData& loca hour_cycles.append(*hour_cycle); } - auto hour_cycles_index = locale_data.unique_hour_cycle_lists.ensure(move(hour_cycles)); - locale_data.hour_cycles.set(key, hour_cycles_index); + auto hour_cycles_index = cldr.unique_hour_cycle_lists.ensure(move(hour_cycles)); + cldr.hour_cycles.set(key, hour_cycles_index); - if (!locale_data.hour_cycle_regions.contains_slow(key)) - locale_data.hour_cycle_regions.append(key); + if (!cldr.hour_cycle_regions.contains_slow(key)) + cldr.hour_cycle_regions.append(key); }); return {}; } -static ErrorOr parse_week_data(String core_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_week_data(String core_path, CLDR& cldr) { // https://unicode.org/reports/tr35/tr35-dates.html#Week_Data LexicalPath week_data_path(move(core_path)); @@ -701,26 +701,26 @@ static ErrorOr parse_week_data(String core_path, UnicodeLocaleData& locale minimum_days_object.as_object().for_each_member([&](auto const& region, auto const& value) { auto minimum_days = value.as_string().template to_uint(); - locale_data.minimum_days.set(region, *minimum_days); + cldr.minimum_days.set(region, *minimum_days); - if (!locale_data.minimum_days_regions.contains_slow(region)) - locale_data.minimum_days_regions.append(region); + if (!cldr.minimum_days_regions.contains_slow(region)) + cldr.minimum_days_regions.append(region); }); first_day_object.as_object().for_each_member([&](auto const& region, auto const& value) { - parse_regional_weekdays(region, value.as_string(), locale_data.first_day, locale_data.first_day_regions); + parse_regional_weekdays(region, value.as_string(), cldr.first_day, cldr.first_day_regions); }); weekend_start_object.as_object().for_each_member([&](auto const& region, auto const& value) { - parse_regional_weekdays(region, value.as_string(), locale_data.weekend_start, locale_data.weekend_start_regions); + parse_regional_weekdays(region, value.as_string(), cldr.weekend_start, cldr.weekend_start_regions); }); weekend_end_object.as_object().for_each_member([&](auto const& region, auto const& value) { - parse_regional_weekdays(region, value.as_string(), locale_data.weekend_end, locale_data.weekend_end_regions); + parse_regional_weekdays(region, value.as_string(), cldr.weekend_end, cldr.weekend_end_regions); }); return {}; } -static ErrorOr parse_meta_zones(String core_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_meta_zones(String core_path, CLDR& cldr) { // https://unicode.org/reports/tr35/tr35-dates.html#Metazones LexicalPath meta_zone_path(move(core_path)); @@ -738,14 +738,14 @@ static ErrorOr parse_meta_zones(String core_path, UnicodeLocaleData& local auto const& golden_zone = mapping.as_object().get("_type"sv); if (auto time_zone = TimeZone::time_zone_from_string(golden_zone.as_string()); time_zone.has_value()) { - auto& golden_zones = locale_data.meta_zones.ensure(meta_zone.as_string()); + auto& golden_zones = cldr.meta_zones.ensure(meta_zone.as_string()); golden_zones.append(*time_zone); } }); // UTC does not appear in metaZones.json. Define it for convenience so other parsers don't need to check for its existence. if (auto time_zone = TimeZone::time_zone_from_string("UTC"sv); time_zone.has_value()) - locale_data.meta_zones.set("UTC"sv, { *time_zone }); + cldr.meta_zones.set("UTC"sv, { *time_zone }); return {}; } @@ -800,7 +800,7 @@ static String remove_period_from_pattern(String pattern) return pattern; } -static Optional parse_date_time_pattern_raw(String pattern, String skeleton, UnicodeLocaleData& locale_data) +static Optional parse_date_time_pattern_raw(String pattern, String skeleton, CLDR& cldr) { // https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table using Unicode::CalendarPatternStyle; @@ -808,7 +808,7 @@ static Optional parse_date_time_pattern_raw(String pattern, Str CalendarPattern format {}; if (!skeleton.is_empty()) - format.skeleton_index = locale_data.unique_strings.ensure(move(skeleton)); + format.skeleton_index = cldr.unique_strings.ensure(move(skeleton)); GenericLexer lexer { pattern }; StringBuilder builder; @@ -1019,18 +1019,18 @@ static Optional parse_date_time_pattern_raw(String pattern, Str return format; } -static Optional parse_date_time_pattern(String pattern, String skeleton, UnicodeLocaleData& locale_data) +static Optional parse_date_time_pattern(String pattern, String skeleton, CLDR& cldr) { - auto format = parse_date_time_pattern_raw(move(pattern), move(skeleton), locale_data); + auto format = parse_date_time_pattern_raw(move(pattern), move(skeleton), cldr); if (!format.has_value()) return {}; - format->pattern_index = locale_data.unique_strings.ensure(move(format->pattern)); + format->pattern_index = cldr.unique_strings.ensure(move(format->pattern)); if (format->pattern12.has_value()) - format->pattern12_index = locale_data.unique_strings.ensure(format->pattern12.release_value()); + format->pattern12_index = cldr.unique_strings.ensure(format->pattern12.release_value()); - return locale_data.unique_patterns.ensure(format.release_value()); + return cldr.unique_patterns.ensure(format.release_value()); } template @@ -1039,7 +1039,7 @@ static constexpr bool char_is_one_of(char ch, Chars&&... chars) return ((ch == chars) || ...); } -static void parse_interval_patterns(Calendar& calendar, JsonObject const& interval_formats_object, UnicodeLocaleData& locale_data) +static void parse_interval_patterns(Calendar& calendar, JsonObject const& interval_formats_object, CLDR& cldr) { // https://unicode.org/reports/tr35/tr35-dates.html#intervalFormats CalendarRangePatternList range_formats {}; @@ -1079,10 +1079,10 @@ static void parse_interval_patterns(Calendar& calendar, JsonObject const& interv auto end_range = pattern.substring_view(end_range_begin); CalendarRangePattern format {}; - format.skeleton_index = locale_data.unique_strings.ensure(skeleton); - format.start_range = locale_data.unique_strings.ensure(start_range); - format.separator = locale_data.unique_strings.ensure(separator); - format.end_range = locale_data.unique_strings.ensure(end_range); + format.skeleton_index = cldr.unique_strings.ensure(skeleton); + format.start_range = cldr.unique_strings.ensure(start_range); + format.separator = cldr.unique_strings.ensure(separator); + format.end_range = cldr.unique_strings.ensure(end_range); return format; }; @@ -1115,11 +1115,11 @@ static void parse_interval_patterns(Calendar& calendar, JsonObject const& interv auto end_range = pattern.substring_view(*begin_index); CalendarRangePattern format {}; - format.skeleton_index = locale_data.unique_strings.ensure(skeleton); + format.skeleton_index = cldr.unique_strings.ensure(skeleton); format.field = field; - format.start_range = locale_data.unique_strings.ensure(start_range); - format.separator = locale_data.unique_strings.ensure(separator); - format.end_range = locale_data.unique_strings.ensure(end_range); + format.start_range = cldr.unique_strings.ensure(start_range); + format.separator = cldr.unique_strings.ensure(separator); + format.end_range = cldr.unique_strings.ensure(end_range); format.for_each_calendar_field_zipped_with(parsed_fields, [](auto& format_field, auto const& parsed_field, auto) { format_field = parsed_field; @@ -1131,7 +1131,7 @@ static void parse_interval_patterns(Calendar& calendar, JsonObject const& interv interval_formats_object.for_each_member([&](auto const& skeleton, auto const& value) { if (skeleton == "intervalFormatFallback"sv) { auto range_format = split_default_range_pattern(skeleton, value.as_string()); - calendar.default_range_format = locale_data.unique_range_patterns.ensure(move(range_format)); + calendar.default_range_format = cldr.unique_range_patterns.ensure(move(range_format)); return; } @@ -1142,32 +1142,32 @@ static void parse_interval_patterns(Calendar& calendar, JsonObject const& interv VERIFY(field.length() == 1); auto name = name_of_field(field[0]); - auto format = parse_date_time_pattern_raw(pattern.as_string(), skeleton, locale_data).release_value(); + auto format = parse_date_time_pattern_raw(pattern.as_string(), skeleton, cldr).release_value(); auto range_format = split_range_pattern(skeleton, name, format.pattern, format); - range_formats.append(locale_data.unique_range_patterns.ensure(move(range_format))); + range_formats.append(cldr.unique_range_patterns.ensure(move(range_format))); if (format.pattern12.has_value()) { auto range12_pattern = split_range_pattern(skeleton, name, *format.pattern12, format); - range12_formats.append(locale_data.unique_range_patterns.ensure(move(range12_pattern))); + range12_formats.append(cldr.unique_range_patterns.ensure(move(range12_pattern))); } else { range12_formats.append(range_formats.last()); } }); }); - calendar.range_formats = locale_data.unique_range_pattern_lists.ensure(move(range_formats)); - calendar.range12_formats = locale_data.unique_range_pattern_lists.ensure(move(range12_formats)); + calendar.range_formats = cldr.unique_range_pattern_lists.ensure(move(range_formats)); + calendar.range12_formats = cldr.unique_range_pattern_lists.ensure(move(range12_formats)); } -static void generate_default_patterns(CalendarPatternList& formats, UnicodeLocaleData& locale_data) +static void generate_default_patterns(CalendarPatternList& formats, CLDR& cldr) { // For compatibility with ICU, we generate a list of default patterns for every locale: // https://github.com/unicode-org/icu/blob/release-71-1/icu4c/source/i18n/dtptngen.cpp#L1343-L1354= static constexpr auto default_patterns = Array { "G"sv, "y"sv, "M"sv, "E"sv, "D"sv, "F"sv, "d"sv, "a"sv, "B"sv, "H"sv, "mm"sv, "ss"sv, "SS"sv, "v"sv }; for (auto pattern : default_patterns) { - auto index = parse_date_time_pattern(pattern, pattern, locale_data); + auto index = parse_date_time_pattern(pattern, pattern, cldr); VERIFY(index.has_value()); if (!formats.contains_slow(*index)) @@ -1175,27 +1175,27 @@ static void generate_default_patterns(CalendarPatternList& formats, UnicodeLocal } } -static void generate_missing_patterns(Calendar& calendar, CalendarPatternList& formats, Vector date_formats, Vector time_formats, UnicodeLocaleData& locale_data) +static void generate_missing_patterns(Calendar& calendar, CalendarPatternList& formats, Vector date_formats, Vector time_formats, CLDR& cldr) { // https://unicode.org/reports/tr35/tr35-dates.html#Missing_Skeleton_Fields auto replace_pattern = [&](auto format, auto time_format, auto date_format) { - auto pattern = locale_data.unique_strings.get(format); - auto time_pattern = locale_data.unique_strings.get(time_format); - auto date_pattern = locale_data.unique_strings.get(date_format); + auto pattern = cldr.unique_strings.get(format); + auto time_pattern = cldr.unique_strings.get(time_format); + auto date_pattern = cldr.unique_strings.get(date_format); auto new_pattern = pattern.replace("{0}"sv, time_pattern, ReplaceMode::FirstOnly).replace("{1}"sv, date_pattern, ReplaceMode::FirstOnly); - return locale_data.unique_strings.ensure(move(new_pattern)); + return cldr.unique_strings.ensure(move(new_pattern)); }; auto inject_fractional_second_digits = [&](auto format) { - auto pattern = locale_data.unique_strings.get(format); + auto pattern = cldr.unique_strings.get(format); auto new_pattern = pattern.replace("{second}"sv, "{second}{decimal}{fractionalSecondDigits}"sv, ReplaceMode::FirstOnly); - return locale_data.unique_strings.ensure(move(new_pattern)); + return cldr.unique_strings.ensure(move(new_pattern)); }; auto append_if_unique = [&](auto format) { - auto format_index = locale_data.unique_patterns.ensure(move(format)); + auto format_index = cldr.unique_patterns.ensure(move(format)); if (!formats.contains_slow(format_index)) formats.append(format_index); @@ -1224,7 +1224,7 @@ static void generate_missing_patterns(Calendar& calendar, CalendarPatternList& f time_formats.extend(move(time_formats_with_fractional_second_digits)); for (auto const& date_format : date_formats) { - auto const& date_time_formats = locale_data.unique_formats.get(calendar.date_time_formats); + auto const& date_time_formats = cldr.unique_formats.get(calendar.date_time_formats); CalendarPatternIndexType date_time_format_index = 0; if (date_format.month == Unicode::CalendarPatternStyle::Long) { @@ -1239,7 +1239,7 @@ static void generate_missing_patterns(Calendar& calendar, CalendarPatternList& f } for (auto const& time_format : time_formats) { - auto format = locale_data.unique_patterns.get(date_time_format_index); + auto format = cldr.unique_patterns.get(date_time_format_index); if (time_format.pattern12_index != 0) format.pattern12_index = replace_pattern(format.pattern_index, time_format.pattern12_index, date_format.pattern_index); @@ -1259,7 +1259,7 @@ static void generate_missing_patterns(Calendar& calendar, CalendarPatternList& f } } -static void parse_calendar_symbols(Calendar& calendar, JsonObject const& calendar_object, UnicodeLocaleData& locale_data) +static void parse_calendar_symbols(Calendar& calendar, JsonObject const& calendar_object, CLDR& cldr) { auto create_symbol_lists = [](size_t size) { SymbolList narrow_symbol_list; @@ -1285,11 +1285,11 @@ static void parse_calendar_symbols(Calendar& calendar, JsonObject const& calenda symbols_list.resize(symbol_index + 1); CalendarSymbols symbols {}; - symbols.narrow_symbols = locale_data.unique_symbol_lists.ensure(move(symbol_lists[0])); - symbols.short_symbols = locale_data.unique_symbol_lists.ensure(move(symbol_lists[1])); - symbols.long_symbols = locale_data.unique_symbol_lists.ensure(move(symbol_lists[2])); + symbols.narrow_symbols = cldr.unique_symbol_lists.ensure(move(symbol_lists[0])); + symbols.short_symbols = cldr.unique_symbol_lists.ensure(move(symbol_lists[1])); + symbols.long_symbols = cldr.unique_symbol_lists.ensure(move(symbol_lists[2])); - auto calendar_symbols_index = locale_data.unique_calendar_symbols.ensure(move(symbols)); + auto calendar_symbols_index = cldr.unique_calendar_symbols.ensure(move(symbols)); symbols_list[symbol_index] = calendar_symbols_index; }; @@ -1301,7 +1301,7 @@ static void parse_calendar_symbols(Calendar& calendar, JsonObject const& calenda auto append_symbol = [&](auto& symbols, auto const& key, auto symbol) { if (auto key_index = key.to_uint(); key_index.has_value()) - symbols[*key_index] = locale_data.unique_strings.ensure(move(symbol)); + symbols[*key_index] = cldr.unique_strings.ensure(move(symbol)); }; narrow_symbols.for_each_member([&](auto const& key, JsonValue const& value) { @@ -1325,7 +1325,7 @@ static void parse_calendar_symbols(Calendar& calendar, JsonObject const& calenda auto append_symbol = [&](auto& symbols, auto const& key, auto symbol) { auto key_index = key.to_uint().value() - 1; - symbols[key_index] = locale_data.unique_strings.ensure(move(symbol)); + symbols[key_index] = cldr.unique_strings.ensure(move(symbol)); }; narrow_symbols.for_each_member([&](auto const& key, JsonValue const& value) { @@ -1349,19 +1349,19 @@ static void parse_calendar_symbols(Calendar& calendar, JsonObject const& calenda auto append_symbol = [&](auto& symbols, auto const& key, auto symbol) { if (key == "sun"sv) - symbols[to_underlying(Unicode::Weekday::Sunday)] = locale_data.unique_strings.ensure(move(symbol)); + symbols[to_underlying(Unicode::Weekday::Sunday)] = cldr.unique_strings.ensure(move(symbol)); else if (key == "mon"sv) - symbols[to_underlying(Unicode::Weekday::Monday)] = locale_data.unique_strings.ensure(move(symbol)); + symbols[to_underlying(Unicode::Weekday::Monday)] = cldr.unique_strings.ensure(move(symbol)); else if (key == "tue"sv) - symbols[to_underlying(Unicode::Weekday::Tuesday)] = locale_data.unique_strings.ensure(move(symbol)); + symbols[to_underlying(Unicode::Weekday::Tuesday)] = cldr.unique_strings.ensure(move(symbol)); else if (key == "wed"sv) - symbols[to_underlying(Unicode::Weekday::Wednesday)] = locale_data.unique_strings.ensure(move(symbol)); + symbols[to_underlying(Unicode::Weekday::Wednesday)] = cldr.unique_strings.ensure(move(symbol)); else if (key == "thu"sv) - symbols[to_underlying(Unicode::Weekday::Thursday)] = locale_data.unique_strings.ensure(move(symbol)); + symbols[to_underlying(Unicode::Weekday::Thursday)] = cldr.unique_strings.ensure(move(symbol)); else if (key == "fri"sv) - symbols[to_underlying(Unicode::Weekday::Friday)] = locale_data.unique_strings.ensure(move(symbol)); + symbols[to_underlying(Unicode::Weekday::Friday)] = cldr.unique_strings.ensure(move(symbol)); else if (key == "sat"sv) - symbols[to_underlying(Unicode::Weekday::Saturday)] = locale_data.unique_strings.ensure(move(symbol)); + symbols[to_underlying(Unicode::Weekday::Saturday)] = cldr.unique_strings.ensure(move(symbol)); }; narrow_symbols.for_each_member([&](auto const& key, JsonValue const& value) { @@ -1385,7 +1385,7 @@ static void parse_calendar_symbols(Calendar& calendar, JsonObject const& calenda auto append_symbol = [&](auto& symbols, auto const& key, auto symbol) { if (auto day_period = day_period_from_string(key); day_period.has_value()) - symbols[to_underlying(*day_period)] = locale_data.unique_strings.ensure(move(symbol)); + symbols[to_underlying(*day_period)] = cldr.unique_strings.ensure(move(symbol)); }; narrow_symbols.for_each_member([&](auto const& key, JsonValue const& value) { @@ -1406,10 +1406,10 @@ static void parse_calendar_symbols(Calendar& calendar, JsonObject const& calenda parse_weekday_symbols(calendar_object.get("days"sv).as_object().get("format"sv).as_object()); parse_day_period_symbols(calendar_object.get("dayPeriods"sv).as_object().get("format"sv).as_object()); - calendar.symbols = locale_data.unique_calendar_symbols_lists.ensure(move(symbols_list)); + calendar.symbols = cldr.unique_calendar_symbols_lists.ensure(move(symbols_list)); } -static ErrorOr parse_calendars(String locale_calendars_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_calendars(String locale_calendars_path, CLDR& cldr, LocaleData& locale) { LexicalPath calendars_path(move(locale_calendars_path)); if (!calendars_path.basename().starts_with("ca-"sv)) @@ -1426,10 +1426,10 @@ static ErrorOr parse_calendars(String locale_calendars_path, UnicodeLocale auto format = patterns_object.get(name); auto skeleton = skeletons_object.get(name); - auto format_index = parse_date_time_pattern(format.as_string(), skeleton.as_string_or(String::empty()), locale_data).value(); + auto format_index = parse_date_time_pattern(format.as_string(), skeleton.as_string_or(String::empty()), cldr).value(); if (patterns) - patterns->append(locale_data.unique_patterns.get(format_index)); + patterns->append(cldr.unique_patterns.get(format_index)); return format_index; }; @@ -1440,7 +1440,7 @@ static ErrorOr parse_calendars(String locale_calendars_path, UnicodeLocale formats.medium_format = parse_pattern("medium"sv); formats.short_format = parse_pattern("short"sv); - return locale_data.unique_formats.ensure(move(formats)); + return cldr.unique_formats.ensure(move(formats)); }; calendars_object.as_object().for_each_member([&](auto const& calendar_name, JsonValue const& value) { @@ -1452,8 +1452,8 @@ static ErrorOr parse_calendars(String locale_calendars_path, UnicodeLocale Calendar calendar {}; CalendarPatternList available_formats {}; - if (!locale_data.calendars.contains_slow(calendar_name)) - locale_data.calendars.append(calendar_name); + if (!cldr.calendars.contains_slow(calendar_name)) + cldr.calendars.append(calendar_name); Vector date_formats; Vector time_formats; @@ -1471,11 +1471,11 @@ static ErrorOr parse_calendars(String locale_calendars_path, UnicodeLocale auto const& available_formats_object = date_time_formats_object.as_object().get("availableFormats"sv); available_formats_object.as_object().for_each_member([&](auto const& skeleton, JsonValue const& pattern) { - auto pattern_index = parse_date_time_pattern(pattern.as_string(), skeleton, locale_data); + auto pattern_index = parse_date_time_pattern(pattern.as_string(), skeleton, cldr); if (!pattern_index.has_value()) return; - auto const& format = locale_data.unique_patterns.get(*pattern_index); + auto const& format = cldr.unique_patterns.get(*pattern_index); if (format.contains_only_date_fields()) date_formats.append(format); else if (format.contains_only_time_fields()) @@ -1486,20 +1486,20 @@ static ErrorOr parse_calendars(String locale_calendars_path, UnicodeLocale }); auto const& interval_formats_object = date_time_formats_object.as_object().get("intervalFormats"sv); - parse_interval_patterns(calendar, interval_formats_object.as_object(), locale_data); + parse_interval_patterns(calendar, interval_formats_object.as_object(), cldr); - generate_default_patterns(available_formats, locale_data); - generate_missing_patterns(calendar, available_formats, move(date_formats), move(time_formats), locale_data); - parse_calendar_symbols(calendar, value.as_object(), locale_data); + generate_default_patterns(available_formats, cldr); + generate_missing_patterns(calendar, available_formats, move(date_formats), move(time_formats), cldr); + parse_calendar_symbols(calendar, value.as_object(), cldr); - calendar.available_formats = locale_data.unique_pattern_lists.ensure(move(available_formats)); - locale.calendars.set(calendar_name, locale_data.unique_calendars.ensure(move(calendar))); + calendar.available_formats = cldr.unique_pattern_lists.ensure(move(available_formats)); + locale.calendars.set(calendar_name, cldr.unique_calendars.ensure(move(calendar))); }); return {}; } -static ErrorOr parse_time_zone_names(String locale_time_zone_names_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_time_zone_names(String locale_time_zone_names_path, CLDR& cldr, LocaleData& locale) { LexicalPath time_zone_names_path(move(locale_time_zone_names_path)); time_zone_names_path = time_zone_names_path.append("timeZoneNames.json"sv); @@ -1524,7 +1524,7 @@ static ErrorOr parse_time_zone_names(String locale_time_zone_names_path, U auto const& name = names.as_object().get(key); if (name.is_string()) - return locale_data.unique_strings.ensure(name.as_string()); + return cldr.unique_strings.ensure(name.as_string()); return {}; }; @@ -1546,22 +1546,22 @@ static ErrorOr parse_time_zone_names(String locale_time_zone_names_path, U auto symbol_behind_sign = hour_formats[1].substring_view(0, hour_format_behind_start); auto symbol_behind_separator = hour_formats[1].substring_view(separator_behind_start, separator_behind_end - separator_behind_start); - time_zone_formats.symbol_ahead_sign = locale_data.unique_strings.ensure(symbol_ahead_sign); - time_zone_formats.symbol_ahead_separator = locale_data.unique_strings.ensure(symbol_ahead_separator); - time_zone_formats.symbol_behind_sign = locale_data.unique_strings.ensure(symbol_behind_sign); - time_zone_formats.symbol_behind_separator = locale_data.unique_strings.ensure(symbol_behind_separator); + time_zone_formats.symbol_ahead_sign = cldr.unique_strings.ensure(symbol_ahead_sign); + time_zone_formats.symbol_ahead_separator = cldr.unique_strings.ensure(symbol_ahead_separator); + time_zone_formats.symbol_behind_sign = cldr.unique_strings.ensure(symbol_behind_sign); + time_zone_formats.symbol_behind_separator = cldr.unique_strings.ensure(symbol_behind_separator); }; TimeZoneNamesList time_zones; TimeZoneFormat time_zone_formats {}; parse_hour_format(hour_format_string.as_string(), time_zone_formats); - time_zone_formats.gmt_format = locale_data.unique_strings.ensure(gmt_format_string.as_string()); - time_zone_formats.gmt_zero_format = locale_data.unique_strings.ensure(gmt_zero_format_string.as_string()); + time_zone_formats.gmt_format = cldr.unique_strings.ensure(gmt_format_string.as_string()); + time_zone_formats.gmt_zero_format = cldr.unique_strings.ensure(gmt_zero_format_string.as_string()); auto parse_time_zone = [&](StringView meta_zone, JsonObject const& meta_zone_object) { - auto golden_zones = locale_data.meta_zones.find(meta_zone); - if (golden_zones == locale_data.meta_zones.end()) + auto golden_zones = cldr.meta_zones.find(meta_zone); + if (golden_zones == cldr.meta_zones.end()) return; TimeZoneNames time_zone_names {}; @@ -1581,7 +1581,7 @@ static ErrorOr parse_time_zone_names(String locale_time_zone_names_path, U if (auto name = parse_name("short"sv, meta_zone_object, "generic"sv); name.has_value()) time_zone_names.short_generic_name = name.value(); - auto time_zone_index = locale_data.unique_time_zones.ensure(move(time_zone_names)); + auto time_zone_index = cldr.unique_time_zones.ensure(move(time_zone_names)); for (auto golden_zone : golden_zones->value) { auto time_zone = to_underlying(golden_zone); @@ -1602,13 +1602,13 @@ static ErrorOr parse_time_zone_names(String locale_time_zone_names_path, U auto const& utc_object = etc_object.as_object().get("UTC"sv); parse_time_zone("UTC"sv, utc_object.as_object()); - locale.time_zones = locale_data.unique_time_zone_lists.ensure(move(time_zones)); - locale.time_zone_formats = locale_data.unique_time_zone_formats.ensure(move(time_zone_formats)); + locale.time_zones = cldr.unique_time_zone_lists.ensure(move(time_zones)); + locale.time_zone_formats = cldr.unique_time_zone_formats.ensure(move(time_zone_formats)); return {}; } -static ErrorOr parse_day_periods(String core_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_day_periods(String core_path, CLDR& cldr) { // https://unicode.org/reports/tr35/tr35-dates.html#Day_Period_Rule_Sets LexicalPath day_periods_path(move(core_path)); @@ -1645,41 +1645,41 @@ static ErrorOr parse_day_periods(String core_path, UnicodeLocaleData& loca }; day_periods_object.as_object().for_each_member([&](auto const& language, JsonValue const& value) { - auto locale = locale_data.locales.find(language); - if (locale == locale_data.locales.end()) + auto locale = cldr.locales.find(language); + if (locale == cldr.locales.end()) return; DayPeriodList day_periods; value.as_object().for_each_member([&](auto const& symbol, JsonValue const& ranges) { if (auto day_period = parse_day_period(symbol, ranges.as_object()); day_period.has_value()) { - auto day_period_index = locale_data.unique_day_periods.ensure(day_period.release_value()); + auto day_period_index = cldr.unique_day_periods.ensure(day_period.release_value()); day_periods.append(day_period_index); } }); - locale->value.day_periods = locale_data.unique_day_period_lists.ensure(move(day_periods)); + locale->value.day_periods = cldr.unique_day_period_lists.ensure(move(day_periods)); }); return {}; } -static ErrorOr parse_all_locales(String core_path, String dates_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_all_locales(String core_path, String dates_path, CLDR& cldr) { - TRY(parse_hour_cycles(core_path, locale_data)); - TRY(parse_week_data(core_path, locale_data)); - TRY(parse_meta_zones(core_path, locale_data)); + TRY(parse_hour_cycles(core_path, cldr)); + TRY(parse_week_data(core_path, cldr)); + TRY(parse_meta_zones(core_path, cldr)); auto dates_iterator = TRY(path_to_dir_iterator(move(dates_path))); auto remove_variants_from_path = [&](String path) -> ErrorOr { - auto parsed_locale = TRY(CanonicalLanguageID::parse(locale_data.unique_strings, LexicalPath::basename(path))); + auto parsed_locale = TRY(CanonicalLanguageID::parse(cldr.unique_strings, LexicalPath::basename(path))); StringBuilder builder; - builder.append(locale_data.unique_strings.get(parsed_locale.language)); - if (auto script = locale_data.unique_strings.get(parsed_locale.script); !script.is_empty()) + builder.append(cldr.unique_strings.get(parsed_locale.language)); + if (auto script = cldr.unique_strings.get(parsed_locale.script); !script.is_empty()) builder.appendff("-{}", script); - if (auto region = locale_data.unique_strings.get(parsed_locale.region); !region.is_empty()) + if (auto region = cldr.unique_strings.get(parsed_locale.region); !region.is_empty()) builder.appendff("-{}", region); return builder.build(); @@ -1690,17 +1690,17 @@ static ErrorOr parse_all_locales(String core_path, String dates_path, Unic auto calendars_iterator = TRY(path_to_dir_iterator(dates_path, {})); auto language = TRY(remove_variants_from_path(dates_path)); - auto& locale = locale_data.locales.ensure(language); + auto& locale = cldr.locales.ensure(language); while (calendars_iterator.has_next()) { auto calendars_path = TRY(next_path_from_dir_iterator(calendars_iterator)); - TRY(parse_calendars(move(calendars_path), locale_data, locale)); + TRY(parse_calendars(move(calendars_path), cldr, locale)); } - TRY(parse_time_zone_names(move(dates_path), locale_data, locale)); + TRY(parse_time_zone_names(move(dates_path), cldr, locale)); } - TRY(parse_day_periods(move(core_path), locale_data)); + TRY(parse_day_periods(move(core_path), cldr)); return {}; } @@ -1716,7 +1716,7 @@ static String format_identifier(StringView owner, String identifier) return identifier; } -static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, UnicodeLocaleData& locale_data) +static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, CLDR& cldr) { StringBuilder builder; SourceGenerator generator { builder }; @@ -1729,12 +1729,12 @@ static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& namespace Unicode { )~~~"); - generate_enum(generator, format_identifier, "Calendar"sv, {}, locale_data.calendars); - generate_enum(generator, format_identifier, "HourCycleRegion"sv, {}, locale_data.hour_cycle_regions); - generate_enum(generator, format_identifier, "MinimumDaysRegion"sv, {}, locale_data.minimum_days_regions); - generate_enum(generator, format_identifier, "FirstDayRegion"sv, {}, locale_data.first_day_regions); - generate_enum(generator, format_identifier, "WeekendStartRegion"sv, {}, locale_data.weekend_start_regions); - generate_enum(generator, format_identifier, "WeekendEndRegion"sv, {}, locale_data.weekend_end_regions); + generate_enum(generator, format_identifier, "Calendar"sv, {}, cldr.calendars); + generate_enum(generator, format_identifier, "HourCycleRegion"sv, {}, cldr.hour_cycle_regions); + generate_enum(generator, format_identifier, "MinimumDaysRegion"sv, {}, cldr.minimum_days_regions); + generate_enum(generator, format_identifier, "FirstDayRegion"sv, {}, cldr.first_day_regions); + generate_enum(generator, format_identifier, "WeekendStartRegion"sv, {}, cldr.weekend_start_regions); + generate_enum(generator, format_identifier, "WeekendEndRegion"sv, {}, cldr.weekend_end_regions); generator.append(R"~~~( } @@ -1744,7 +1744,7 @@ namespace Unicode { return {}; } -static ErrorOr generate_unicode_locale_implementation(Core::Stream::BufferedFile& file, UnicodeLocaleData& locale_data) +static ErrorOr generate_unicode_locale_implementation(Core::Stream::BufferedFile& file, CLDR& cldr) { StringBuilder builder; SourceGenerator generator { builder }; @@ -1777,7 +1777,7 @@ static ErrorOr generate_unicode_locale_implementation(Core::Stream::Buffer namespace Unicode { )~~~"); - locale_data.unique_strings.generate(generator); + cldr.unique_strings.generate(generator); generator.append(R"~~~( template @@ -1871,10 +1871,10 @@ struct CalendarRangePatternImpl { }; )~~~"); - locale_data.unique_patterns.generate(generator, "CalendarPatternImpl"sv, "s_calendar_patterns"sv, 10); - locale_data.unique_pattern_lists.generate(generator, s_calendar_pattern_index_type, "s_calendar_pattern_lists"sv); - locale_data.unique_range_patterns.generate(generator, "CalendarRangePatternImpl"sv, "s_calendar_range_patterns"sv, 10); - locale_data.unique_range_pattern_lists.generate(generator, s_calendar_range_pattern_index_type, "s_calendar_range_pattern_lists"sv); + cldr.unique_patterns.generate(generator, "CalendarPatternImpl"sv, "s_calendar_patterns"sv, 10); + cldr.unique_pattern_lists.generate(generator, s_calendar_pattern_index_type, "s_calendar_pattern_lists"sv); + cldr.unique_range_patterns.generate(generator, "CalendarRangePatternImpl"sv, "s_calendar_range_patterns"sv, 10); + cldr.unique_range_pattern_lists.generate(generator, s_calendar_range_pattern_index_type, "s_calendar_range_pattern_lists"sv); generator.append(R"~~~( struct CalendarFormatImpl { @@ -1956,17 +1956,17 @@ struct DayPeriodData { }; )~~~"); - locale_data.unique_formats.generate(generator, "CalendarFormatImpl"sv, "s_calendar_formats"sv, 10); - locale_data.unique_symbol_lists.generate(generator, s_string_index_type, "s_symbol_lists"sv); - locale_data.unique_calendar_symbols.generate(generator, "CalendarSymbols"sv, "s_calendar_symbols"sv, 10); - locale_data.unique_calendar_symbols_lists.generate(generator, s_calendar_symbols_index_type, "s_calendar_symbol_lists"sv); - locale_data.unique_calendars.generate(generator, "CalendarData"sv, "s_calendars"sv, 10); - locale_data.unique_time_zones.generate(generator, "TimeZoneNames"sv, "s_time_zones"sv, 30); - locale_data.unique_time_zone_lists.generate(generator, s_time_zone_index_type, "s_time_zone_lists"sv); - locale_data.unique_time_zone_formats.generate(generator, "TimeZoneFormatImpl"sv, "s_time_zone_formats"sv, 30); - locale_data.unique_day_periods.generate(generator, "DayPeriodData"sv, "s_day_periods"sv, 30); - locale_data.unique_day_period_lists.generate(generator, s_day_period_index_type, "s_day_period_lists"sv); - locale_data.unique_hour_cycle_lists.generate(generator, "u8"sv, "s_hour_cycle_lists"sv); + cldr.unique_formats.generate(generator, "CalendarFormatImpl"sv, "s_calendar_formats"sv, 10); + cldr.unique_symbol_lists.generate(generator, s_string_index_type, "s_symbol_lists"sv); + cldr.unique_calendar_symbols.generate(generator, "CalendarSymbols"sv, "s_calendar_symbols"sv, 10); + cldr.unique_calendar_symbols_lists.generate(generator, s_calendar_symbols_index_type, "s_calendar_symbol_lists"sv); + cldr.unique_calendars.generate(generator, "CalendarData"sv, "s_calendars"sv, 10); + cldr.unique_time_zones.generate(generator, "TimeZoneNames"sv, "s_time_zones"sv, 30); + cldr.unique_time_zone_lists.generate(generator, s_time_zone_index_type, "s_time_zone_lists"sv); + cldr.unique_time_zone_formats.generate(generator, "TimeZoneFormatImpl"sv, "s_time_zone_formats"sv, 30); + cldr.unique_day_periods.generate(generator, "DayPeriodData"sv, "s_day_periods"sv, 30); + cldr.unique_day_period_lists.generate(generator, s_day_period_index_type, "s_day_period_lists"sv); + cldr.unique_hour_cycle_lists.generate(generator, "u8"sv, "s_hour_cycle_lists"sv); auto append_calendars = [&](String name, auto const& calendars) { generator.set("name", name); @@ -1976,7 +1976,7 @@ struct DayPeriodData { static constexpr Array<@calendar_index_type@, @size@> @name@ { {)~~~"); bool first = true; - for (auto const& calendar_key : locale_data.calendars) { + for (auto const& calendar_key : cldr.calendars) { auto calendar = calendars.find(calendar_key)->value; generator.append(first ? " "sv : ", "sv); @@ -2008,18 +2008,18 @@ static constexpr Array<@type@, @size@> @name@ { {)~~~"); generator.append(" } };"); }; - auto locales = locale_data.locales.keys(); + auto locales = cldr.locales.keys(); quick_sort(locales); - generate_mapping(generator, locale_data.locales, s_calendar_index_type, "s_locale_calendars"sv, "s_calendars_{}"sv, format_identifier, [&](auto const& name, auto const& value) { append_calendars(name, value.calendars); }); - append_mapping(locales, locale_data.locales, s_time_zone_index_type, "s_locale_time_zones"sv, [](auto const& locale) { return locale.time_zones; }); - append_mapping(locales, locale_data.locales, s_time_zone_format_index_type, "s_locale_time_zone_formats"sv, [](auto const& locale) { return locale.time_zone_formats; }); - append_mapping(locales, locale_data.locales, s_day_period_index_type, "s_locale_day_periods"sv, [](auto const& locale) { return locale.day_periods; }); - append_mapping(locale_data.hour_cycle_regions, locale_data.hour_cycles, s_hour_cycle_list_index_type, "s_hour_cycles"sv, [](auto const& hour_cycles) { return hour_cycles; }); - append_mapping(locale_data.minimum_days_regions, locale_data.minimum_days, "u8"sv, "s_minimum_days"sv, [](auto minimum_days) { return minimum_days; }); - append_mapping(locale_data.first_day_regions, locale_data.first_day, "u8"sv, "s_first_day"sv, [](auto first_day) { return to_underlying(first_day); }); - append_mapping(locale_data.weekend_start_regions, locale_data.weekend_start, "u8"sv, "s_weekend_start"sv, [](auto weekend_start) { return to_underlying(weekend_start); }); - append_mapping(locale_data.weekend_end_regions, locale_data.weekend_end, "u8"sv, "s_weekend_end"sv, [](auto weekend_end) { return to_underlying(weekend_end); }); + generate_mapping(generator, cldr.locales, s_calendar_index_type, "s_locale_calendars"sv, "s_calendars_{}"sv, format_identifier, [&](auto const& name, auto const& value) { append_calendars(name, value.calendars); }); + append_mapping(locales, cldr.locales, s_time_zone_index_type, "s_locale_time_zones"sv, [](auto const& locale) { return locale.time_zones; }); + append_mapping(locales, cldr.locales, s_time_zone_format_index_type, "s_locale_time_zone_formats"sv, [](auto const& locale) { return locale.time_zone_formats; }); + append_mapping(locales, cldr.locales, s_day_period_index_type, "s_locale_day_periods"sv, [](auto const& locale) { return locale.day_periods; }); + append_mapping(cldr.hour_cycle_regions, cldr.hour_cycles, s_hour_cycle_list_index_type, "s_hour_cycles"sv, [](auto const& hour_cycles) { return hour_cycles; }); + append_mapping(cldr.minimum_days_regions, cldr.minimum_days, "u8"sv, "s_minimum_days"sv, [](auto minimum_days) { return minimum_days; }); + append_mapping(cldr.first_day_regions, cldr.first_day, "u8"sv, "s_first_day"sv, [](auto first_day) { return to_underlying(first_day); }); + append_mapping(cldr.weekend_start_regions, cldr.weekend_start, "u8"sv, "s_weekend_start"sv, [](auto weekend_start) { return to_underlying(weekend_start); }); + append_mapping(cldr.weekend_end_regions, cldr.weekend_end, "u8"sv, "s_weekend_end"sv, [](auto weekend_end) { return to_underlying(weekend_end); }); generator.append("\n"); auto append_from_string = [&](StringView enum_title, StringView enum_snake, auto const& values, Vector const& aliases = {}) { @@ -2034,18 +2034,18 @@ static constexpr Array<@type@, @size@> @name@ { {)~~~"); generate_value_from_string(generator, "{}_from_string"sv, enum_title, enum_snake, move(hashes)); }; - append_from_string("HourCycleRegion"sv, "hour_cycle_region"sv, locale_data.hour_cycle_regions); - append_from_string("MinimumDaysRegion"sv, "minimum_days_region"sv, locale_data.minimum_days_regions); - append_from_string("FirstDayRegion"sv, "first_day_region"sv, locale_data.first_day_regions); - append_from_string("WeekendStartRegion"sv, "weekend_start_region"sv, locale_data.weekend_start_regions); - append_from_string("WeekendEndRegion"sv, "weekend_end_region"sv, locale_data.weekend_end_regions); + append_from_string("HourCycleRegion"sv, "hour_cycle_region"sv, cldr.hour_cycle_regions); + append_from_string("MinimumDaysRegion"sv, "minimum_days_region"sv, cldr.minimum_days_regions); + append_from_string("FirstDayRegion"sv, "first_day_region"sv, cldr.first_day_regions); + append_from_string("WeekendStartRegion"sv, "weekend_start_region"sv, cldr.weekend_start_regions); + append_from_string("WeekendEndRegion"sv, "weekend_end_region"sv, cldr.weekend_end_regions); generator.append(R"~~~( static Optional keyword_to_calendar(KeywordCalendar keyword) { switch (keyword) {)~~~"); - for (auto const& calendar : locale_data.calendars) { + for (auto const& calendar : cldr.calendars) { generator.set("name"sv, format_identifier({}, calendar)); generator.append(R"~~~( case KeywordCalendar::@name@: @@ -2430,11 +2430,11 @@ ErrorOr serenity_main(Main::Arguments arguments) auto generated_header_file = TRY(open_file(generated_header_path, Core::Stream::OpenMode::Write)); auto generated_implementation_file = TRY(open_file(generated_implementation_path, Core::Stream::OpenMode::Write)); - UnicodeLocaleData locale_data; - TRY(parse_all_locales(core_path, dates_path, locale_data)); + CLDR cldr; + TRY(parse_all_locales(core_path, dates_path, cldr)); - TRY(generate_unicode_locale_header(*generated_header_file, locale_data)); - TRY(generate_unicode_locale_implementation(*generated_implementation_file, locale_data)); + TRY(generate_unicode_locale_header(*generated_header_file, cldr)); + TRY(generate_unicode_locale_implementation(*generated_implementation_file, cldr)); return 0; } diff --git a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateLocaleData.cpp b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateLocaleData.cpp index 8f3a12aca5..87024611ab 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateLocaleData.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateLocaleData.cpp @@ -188,7 +188,7 @@ using DateFieldList = Vector; using KeywordList = Vector; using ListPatternList = Vector; -struct Locale { +struct LocaleData { String language; Optional territory; Optional variant; @@ -217,7 +217,7 @@ struct LanguageMapping { CanonicalLanguageID alias {}; }; -struct UnicodeLocaleData { +struct CLDR { UniqueStringStorage unique_strings; UniqueStorage unique_display_patterns; UniqueStorage unique_language_lists; @@ -231,7 +231,7 @@ struct UnicodeLocaleData { UniqueStorage unique_list_pattern_lists; UniqueStorage unique_text_layouts; - HashMap locales; + HashMap locales; Vector locale_aliases; Vector languages; @@ -274,14 +274,14 @@ struct UnicodeLocaleData { _temporary_result.release_value(); \ }) -static ErrorOr parse_language_mapping(UnicodeLocaleData& locale_data, StringView key, StringView alias) +static ErrorOr parse_language_mapping(CLDR& cldr, StringView key, StringView alias) { - auto parsed_key = TRY(CanonicalLanguageID::parse(locale_data.unique_strings, key)); - auto parsed_alias = TRY(CanonicalLanguageID::parse(locale_data.unique_strings, alias)); + auto parsed_key = TRY(CanonicalLanguageID::parse(cldr.unique_strings, key)); + auto parsed_alias = TRY(CanonicalLanguageID::parse(cldr.unique_strings, alias)); return LanguageMapping { move(parsed_key), move(parsed_alias) }; } -static ErrorOr parse_core_aliases(String core_supplemental_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_core_aliases(String core_supplemental_path, CLDR& cldr) { LexicalPath core_aliases_path(move(core_supplemental_path)); core_aliases_path = core_aliases_path.append("aliases.json"sv); @@ -296,26 +296,26 @@ static ErrorOr parse_core_aliases(String core_supplemental_path, UnicodeLo auto alias = value.as_object().get("_replacement"sv).as_string(); if (key.contains('-')) { - auto mapping = TRY_OR_DISCARD(parse_language_mapping(locale_data, key, alias)); - locale_data.max_variant_size = max(mapping.key.variants.size(), locale_data.max_variant_size); - locale_data.max_variant_size = max(mapping.alias.variants.size(), locale_data.max_variant_size); - locale_data.complex_mappings.append(move(mapping)); + auto mapping = TRY_OR_DISCARD(parse_language_mapping(cldr, key, alias)); + cldr.max_variant_size = max(mapping.key.variants.size(), cldr.max_variant_size); + cldr.max_variant_size = max(mapping.alias.variants.size(), cldr.max_variant_size); + cldr.complex_mappings.append(move(mapping)); } else { - alias_map.set(key, locale_data.unique_strings.ensure(alias)); + alias_map.set(key, cldr.unique_strings.ensure(alias)); } }); }; - append_aliases(alias_object.as_object().get("languageAlias"sv), locale_data.language_aliases); - append_aliases(alias_object.as_object().get("territoryAlias"sv), locale_data.territory_aliases); - append_aliases(alias_object.as_object().get("scriptAlias"sv), locale_data.script_aliases); - append_aliases(alias_object.as_object().get("variantAlias"sv), locale_data.variant_aliases); - append_aliases(alias_object.as_object().get("subdivisionAlias"sv), locale_data.subdivision_aliases); + append_aliases(alias_object.as_object().get("languageAlias"sv), cldr.language_aliases); + append_aliases(alias_object.as_object().get("territoryAlias"sv), cldr.territory_aliases); + append_aliases(alias_object.as_object().get("scriptAlias"sv), cldr.script_aliases); + append_aliases(alias_object.as_object().get("variantAlias"sv), cldr.variant_aliases); + append_aliases(alias_object.as_object().get("subdivisionAlias"sv), cldr.subdivision_aliases); return {}; } -static ErrorOr parse_likely_subtags(String core_supplemental_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_likely_subtags(String core_supplemental_path, CLDR& cldr) { LexicalPath likely_subtags_path(move(core_supplemental_path)); likely_subtags_path = likely_subtags_path.append("likelySubtags.json"sv); @@ -325,16 +325,16 @@ static ErrorOr parse_likely_subtags(String core_supplemental_path, Unicode auto const& likely_subtags_object = supplemental_object.as_object().get("likelySubtags"sv); likely_subtags_object.as_object().for_each_member([&](auto const& key, JsonValue const& value) { - auto mapping = TRY_OR_DISCARD(parse_language_mapping(locale_data, key, value.as_string())); - locale_data.max_variant_size = max(mapping.key.variants.size(), locale_data.max_variant_size); - locale_data.max_variant_size = max(mapping.alias.variants.size(), locale_data.max_variant_size); - locale_data.likely_subtags.append(move(mapping)); + auto mapping = TRY_OR_DISCARD(parse_language_mapping(cldr, key, value.as_string())); + cldr.max_variant_size = max(mapping.key.variants.size(), cldr.max_variant_size); + cldr.max_variant_size = max(mapping.alias.variants.size(), cldr.max_variant_size); + cldr.likely_subtags.append(move(mapping)); }); return {}; } -static ErrorOr parse_identity(String locale_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_identity(String locale_path, CLDR& cldr, LocaleData& locale) { LexicalPath languages_path(move(locale_path)); // Note: Every JSON file defines identity data, so we can use any of them. languages_path = languages_path.append("languages.json"sv); @@ -352,26 +352,26 @@ static ErrorOr parse_identity(String locale_path, UnicodeLocaleData& local if (territory_string.is_string()) { locale.territory = territory_string.as_string(); - if (!locale_data.territories.contains_slow(*locale.territory)) - locale_data.territories.append(*locale.territory); + if (!cldr.territories.contains_slow(*locale.territory)) + cldr.territories.append(*locale.territory); } if (script_string.is_string()) { auto script = script_string.as_string(); - if (!locale_data.scripts.contains_slow(script)) - locale_data.scripts.append(script); + if (!cldr.scripts.contains_slow(script)) + cldr.scripts.append(script); } if (variant_string.is_string()) { locale.variant = variant_string.as_string(); - if (!locale_data.variants.contains_slow(*locale.variant)) - locale_data.variants.append(*locale.variant); + if (!cldr.variants.contains_slow(*locale.variant)) + cldr.variants.append(*locale.variant); } return {}; } -static ErrorOr parse_locale_display_patterns(String locale_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_locale_display_patterns(String locale_path, CLDR& cldr, LocaleData& locale) { LexicalPath locale_display_names_path(move(locale_path)); locale_display_names_path = locale_display_names_path.append("localeDisplayNames.json"sv); @@ -385,14 +385,14 @@ static ErrorOr parse_locale_display_patterns(String locale_path, UnicodeLo auto const& locale_separator = locale_display_patterns_object.as_object().get("localeSeparator"sv); DisplayPattern patterns {}; - patterns.locale_pattern = locale_data.unique_strings.ensure(locale_pattern.as_string()); - patterns.locale_separator = locale_data.unique_strings.ensure(locale_separator.as_string()); + patterns.locale_pattern = cldr.unique_strings.ensure(locale_pattern.as_string()); + patterns.locale_separator = cldr.unique_strings.ensure(locale_separator.as_string()); - locale.display_patterns = locale_data.unique_display_patterns.ensure(move(patterns)); + locale.display_patterns = cldr.unique_display_patterns.ensure(move(patterns)); return {}; } -static ErrorOr preprocess_languages(String locale_path, UnicodeLocaleData& locale_data) +static ErrorOr preprocess_languages(String locale_path, CLDR& cldr) { LexicalPath languages_path(move(locale_path)); languages_path = languages_path.append("languages.json"sv); @@ -404,14 +404,14 @@ static ErrorOr preprocess_languages(String locale_path, UnicodeLocaleData& auto const& languages_object = locale_display_names_object.as_object().get("languages"sv); languages_object.as_object().for_each_member([&](auto const& key, auto const&) { - if (!key.contains("-alt-"sv) && !locale_data.languages.contains_slow(key)) - locale_data.languages.append(key); + if (!key.contains("-alt-"sv) && !cldr.languages.contains_slow(key)) + cldr.languages.append(key); }); return {}; } -static ErrorOr parse_unicode_extension_keywords(String bcp47_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_unicode_extension_keywords(String bcp47_path, CLDR& cldr) { constexpr auto desired_keywords = Array { "ca"sv, "co"sv, "hc"sv, "kf"sv, "kn"sv, "nu"sv }; auto keywords = TRY(read_json_file(bcp47_path)); @@ -426,9 +426,9 @@ static ErrorOr parse_unicode_extension_keywords(String bcp47_path, Unicode return; auto const& name = value.as_object().get("_alias"sv); - locale_data.keyword_names.set(key, name.as_string()); + cldr.keyword_names.set(key, name.as_string()); - auto& keywords = locale_data.keywords.ensure(key); + auto& keywords = cldr.keywords.ensure(key); // FIXME: ECMA-402 requires the list of supported collation types to include "default", but // that type does not appear in collation.json. @@ -448,12 +448,12 @@ static ErrorOr parse_unicode_extension_keywords(String bcp47_path, Unicode return; if (auto const& preferred = properties.as_object().get("_preferred"sv); preferred.is_string()) { - locale_data.keyword_aliases.ensure(key).append({ preferred.as_string(), keyword }); + cldr.keyword_aliases.ensure(key).append({ preferred.as_string(), keyword }); return; } if (auto const& alias = properties.as_object().get("_alias"sv); alias.is_string()) - locale_data.keyword_aliases.ensure(key).append({ keyword, alias.as_string() }); + cldr.keyword_aliases.ensure(key).append({ keyword, alias.as_string() }); keywords.append(keyword); }); @@ -462,10 +462,10 @@ static ErrorOr parse_unicode_extension_keywords(String bcp47_path, Unicode return {}; } -static Optional find_keyword_alias(StringView key, StringView calendar, UnicodeLocaleData& locale_data) +static Optional find_keyword_alias(StringView key, StringView calendar, CLDR& cldr) { - auto it = locale_data.keyword_aliases.find(key); - if (it == locale_data.keyword_aliases.end()) + auto it = cldr.keyword_aliases.find(key); + if (it == cldr.keyword_aliases.end()) return {}; auto alias = it->value.find_if([&](auto const& alias) { return calendar == alias.alias; }); @@ -475,7 +475,7 @@ static Optional find_keyword_alias(StringView key, StringView calendar, return alias->name; } -static ErrorOr parse_locale_languages(String locale_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_locale_languages(String locale_path, CLDR& cldr, LocaleData& locale) { LexicalPath languages_path(move(locale_path)); languages_path = languages_path.append("languages.json"sv); @@ -487,21 +487,21 @@ static ErrorOr parse_locale_languages(String locale_path, UnicodeLocaleDat auto const& languages_object = locale_display_names_object.as_object().get("languages"sv); LanguageList languages; - languages.resize(locale_data.languages.size()); + languages.resize(cldr.languages.size()); languages_object.as_object().for_each_member([&](auto const& key, JsonValue const& value) { if (key.contains("-alt-"sv)) return; - auto index = locale_data.languages.find_first_index(key).value(); - languages[index] = locale_data.unique_strings.ensure(value.as_string()); + auto index = cldr.languages.find_first_index(key).value(); + languages[index] = cldr.unique_strings.ensure(value.as_string()); }); - locale.languages = locale_data.unique_language_lists.ensure(move(languages)); + locale.languages = cldr.unique_language_lists.ensure(move(languages)); return {}; } -static ErrorOr parse_locale_territories(String locale_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_locale_territories(String locale_path, CLDR& cldr, LocaleData& locale) { LexicalPath territories_path(move(locale_path)); territories_path = territories_path.append("territories.json"sv); @@ -513,18 +513,18 @@ static ErrorOr parse_locale_territories(String locale_path, UnicodeLocaleD auto const& territories_object = locale_display_names_object.as_object().get("territories"sv); TerritoryList territories; - territories.resize(locale_data.territories.size()); + territories.resize(cldr.territories.size()); territories_object.as_object().for_each_member([&](auto const& key, JsonValue const& value) { - if (auto index = locale_data.territories.find_first_index(key); index.has_value()) - territories[*index] = locale_data.unique_strings.ensure(value.as_string()); + if (auto index = cldr.territories.find_first_index(key); index.has_value()) + territories[*index] = cldr.unique_strings.ensure(value.as_string()); }); - locale.territories = locale_data.unique_territory_lists.ensure(move(territories)); + locale.territories = cldr.unique_territory_lists.ensure(move(territories)); return {}; } -static ErrorOr parse_locale_scripts(String locale_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_locale_scripts(String locale_path, CLDR& cldr, LocaleData& locale) { LexicalPath scripts_path(move(locale_path)); scripts_path = scripts_path.append("scripts.json"sv); @@ -536,18 +536,18 @@ static ErrorOr parse_locale_scripts(String locale_path, UnicodeLocaleData& auto const& scripts_object = locale_display_names_object.as_object().get("scripts"sv); ScriptList scripts; - scripts.resize(locale_data.scripts.size()); + scripts.resize(cldr.scripts.size()); scripts_object.as_object().for_each_member([&](auto const& key, JsonValue const& value) { - if (auto index = locale_data.scripts.find_first_index(key); index.has_value()) - scripts[*index] = locale_data.unique_strings.ensure(value.as_string()); + if (auto index = cldr.scripts.find_first_index(key); index.has_value()) + scripts[*index] = cldr.unique_strings.ensure(value.as_string()); }); - locale.scripts = locale_data.unique_script_lists.ensure(move(scripts)); + locale.scripts = cldr.unique_script_lists.ensure(move(scripts)); return {}; } -static ErrorOr parse_locale_list_patterns(String misc_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_locale_list_patterns(String misc_path, CLDR& cldr, LocaleData& locale) { LexicalPath list_patterns_path(move(misc_path)); list_patterns_path = list_patterns_path.append("listPatterns.json"sv); @@ -582,23 +582,23 @@ static ErrorOr parse_locale_list_patterns(String misc_path, UnicodeLocaleD auto type = list_pattern_type(key); auto style = list_pattern_style(key); - auto start = locale_data.unique_strings.ensure(value.as_object().get("start"sv).as_string()); - auto middle = locale_data.unique_strings.ensure(value.as_object().get("middle"sv).as_string()); - auto end = locale_data.unique_strings.ensure(value.as_object().get("end"sv).as_string()); - auto pair = locale_data.unique_strings.ensure(value.as_object().get("2"sv).as_string()); + auto start = cldr.unique_strings.ensure(value.as_object().get("start"sv).as_string()); + auto middle = cldr.unique_strings.ensure(value.as_object().get("middle"sv).as_string()); + auto end = cldr.unique_strings.ensure(value.as_object().get("end"sv).as_string()); + auto pair = cldr.unique_strings.ensure(value.as_object().get("2"sv).as_string()); - if (!locale_data.list_pattern_types.contains_slow(type)) - locale_data.list_pattern_types.append(type); + if (!cldr.list_pattern_types.contains_slow(type)) + cldr.list_pattern_types.append(type); ListPatterns list_pattern { type, style, start, middle, end, pair }; - list_patterns.append(locale_data.unique_list_patterns.ensure(move(list_pattern))); + list_patterns.append(cldr.unique_list_patterns.ensure(move(list_pattern))); }); - locale.list_patterns = locale_data.unique_list_pattern_lists.ensure(move(list_patterns)); + locale.list_patterns = cldr.unique_list_pattern_lists.ensure(move(list_patterns)); return {}; } -static ErrorOr parse_locale_layout(String misc_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_locale_layout(String misc_path, CLDR& cldr, LocaleData& locale) { LexicalPath layout_path(move(misc_path)); layout_path = layout_path.append("layout.json"sv); @@ -623,14 +623,14 @@ static ErrorOr parse_locale_layout(String misc_path, UnicodeLocaleData& lo TextLayout layout {}; layout.character_order = text_layout_character_order(character_order); - if (!locale_data.character_orders.contains_slow(layout.character_order)) - locale_data.character_orders.append(layout.character_order); + if (!cldr.character_orders.contains_slow(layout.character_order)) + cldr.character_orders.append(layout.character_order); - locale.text_layout = locale_data.unique_text_layouts.ensure(move(layout)); + locale.text_layout = cldr.unique_text_layouts.ensure(move(layout)); return {}; } -static ErrorOr parse_locale_currencies(String numbers_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_locale_currencies(String numbers_path, CLDR& cldr, LocaleData& locale) { LexicalPath currencies_path(move(numbers_path)); currencies_path = currencies_path.append("currencies.json"sv); @@ -642,21 +642,21 @@ static ErrorOr parse_locale_currencies(String numbers_path, UnicodeLocaleD auto const& currencies_object = locale_numbers_object.as_object().get("currencies"sv); currencies_object.as_object().for_each_member([&](auto const& key, JsonValue const&) { - if (!locale_data.currencies.contains_slow(key)) - locale_data.currencies.append(key); + if (!cldr.currencies.contains_slow(key)) + cldr.currencies.append(key); }); CurrencyList long_currencies {}; - long_currencies.resize(locale_data.currencies.size()); + long_currencies.resize(cldr.currencies.size()); CurrencyList short_currencies {}; - short_currencies.resize(locale_data.currencies.size()); + short_currencies.resize(cldr.currencies.size()); CurrencyList narrow_currencies {}; - narrow_currencies.resize(locale_data.currencies.size()); + narrow_currencies.resize(cldr.currencies.size()); CurrencyList numeric_currencies {}; - numeric_currencies.resize(locale_data.currencies.size()); + numeric_currencies.resize(cldr.currencies.size()); currencies_object.as_object().for_each_member([&](auto const& key, JsonValue const& value) { auto const& long_name = value.as_object().get("displayName"sv); @@ -664,21 +664,21 @@ static ErrorOr parse_locale_currencies(String numbers_path, UnicodeLocaleD auto const& narrow_name = value.as_object().get("symbol-alt-narrow"sv); auto const& numeric_name = value.as_object().get("displayName-count-other"sv); - auto index = locale_data.currencies.find_first_index(key).value(); - long_currencies[index] = locale_data.unique_strings.ensure(long_name.as_string()); - short_currencies[index] = locale_data.unique_strings.ensure(short_name.as_string()); - narrow_currencies[index] = narrow_name.is_null() ? 0 : locale_data.unique_strings.ensure(narrow_name.as_string()); - numeric_currencies[index] = locale_data.unique_strings.ensure(numeric_name.is_null() ? long_name.as_string() : numeric_name.as_string()); + auto index = cldr.currencies.find_first_index(key).value(); + long_currencies[index] = cldr.unique_strings.ensure(long_name.as_string()); + short_currencies[index] = cldr.unique_strings.ensure(short_name.as_string()); + narrow_currencies[index] = narrow_name.is_null() ? 0 : cldr.unique_strings.ensure(narrow_name.as_string()); + numeric_currencies[index] = cldr.unique_strings.ensure(numeric_name.is_null() ? long_name.as_string() : numeric_name.as_string()); }); - locale.long_currencies = locale_data.unique_currency_lists.ensure(move(long_currencies)); - locale.short_currencies = locale_data.unique_currency_lists.ensure(move(short_currencies)); - locale.narrow_currencies = locale_data.unique_currency_lists.ensure(move(narrow_currencies)); - locale.numeric_currencies = locale_data.unique_currency_lists.ensure(move(numeric_currencies)); + locale.long_currencies = cldr.unique_currency_lists.ensure(move(long_currencies)); + locale.short_currencies = cldr.unique_currency_lists.ensure(move(short_currencies)); + locale.narrow_currencies = cldr.unique_currency_lists.ensure(move(narrow_currencies)); + locale.numeric_currencies = cldr.unique_currency_lists.ensure(move(numeric_currencies)); return {}; } -static ErrorOr parse_locale_calendars(String locale_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_locale_calendars(String locale_path, CLDR& cldr, LocaleData& locale) { LexicalPath locale_display_names_path(move(locale_path)); locale_display_names_path = locale_display_names_path.append("localeDisplayNames.json"sv); @@ -690,7 +690,7 @@ static ErrorOr parse_locale_calendars(String locale_path, UnicodeLocaleDat auto const& types_object = locale_display_names_object.as_object().get("types"sv); auto const& calendar_object = types_object.as_object().get("calendar"sv); - auto const& supported_calendars = locale_data.keywords.find("ca"sv)->value; + auto const& supported_calendars = cldr.keywords.find("ca"sv)->value; CalendarList calendars; calendars.resize(supported_calendars.size()); @@ -698,18 +698,18 @@ static ErrorOr parse_locale_calendars(String locale_path, UnicodeLocaleDat calendar_object.as_object().for_each_member([&](auto const& key, auto const& calendar) { auto index = supported_calendars.find_first_index(key); if (!index.has_value()) { - auto alias = find_keyword_alias("ca"sv, key, locale_data); + auto alias = find_keyword_alias("ca"sv, key, cldr); index = supported_calendars.find_first_index(*alias); } - calendars[*index] = locale_data.unique_strings.ensure(calendar.as_string()); + calendars[*index] = cldr.unique_strings.ensure(calendar.as_string()); }); - locale.calendars = locale_data.unique_calendar_lists.ensure(move(calendars)); + locale.calendars = cldr.unique_calendar_lists.ensure(move(calendars)); return {}; } -static ErrorOr parse_locale_date_fields(String dates_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_locale_date_fields(String dates_path, CLDR& cldr, LocaleData& locale) { LexicalPath date_fields_path(move(dates_path)); date_fields_path = date_fields_path.append("dateFields.json"sv); @@ -730,20 +730,20 @@ static ErrorOr parse_locale_date_fields(String dates_path, UnicodeLocaleDa if (!is_sanctioned_field(key)) return; - if (!locale_data.date_fields.contains_slow(key)) - locale_data.date_fields.append(key); + if (!cldr.date_fields.contains_slow(key)) + cldr.date_fields.append(key); }); - quick_sort(locale_data.date_fields); + quick_sort(cldr.date_fields); DateFieldList long_date_fields {}; - long_date_fields.resize(locale_data.date_fields.size()); + long_date_fields.resize(cldr.date_fields.size()); DateFieldList short_date_fields {}; - short_date_fields.resize(locale_data.date_fields.size()); + short_date_fields.resize(cldr.date_fields.size()); DateFieldList narrow_date_fields {}; - narrow_date_fields.resize(locale_data.date_fields.size()); + narrow_date_fields.resize(cldr.date_fields.size()); fields_object.as_object().for_each_member([&](auto const& key, JsonValue const& value) { if (!is_sanctioned_field(key)) @@ -753,19 +753,19 @@ static ErrorOr parse_locale_date_fields(String dates_path, UnicodeLocaleDa auto const& short_name = fields_object.as_object().get(String::formatted("{}-short", key)).as_object().get("displayName"sv); auto const& narrow_name = fields_object.as_object().get(String::formatted("{}-narrow", key)).as_object().get("displayName"sv); - auto index = locale_data.date_fields.find_first_index(key).value(); - long_date_fields[index] = locale_data.unique_strings.ensure(long_name.as_string()); - short_date_fields[index] = locale_data.unique_strings.ensure(short_name.as_string()); - narrow_date_fields[index] = locale_data.unique_strings.ensure(narrow_name.as_string()); + auto index = cldr.date_fields.find_first_index(key).value(); + long_date_fields[index] = cldr.unique_strings.ensure(long_name.as_string()); + short_date_fields[index] = cldr.unique_strings.ensure(short_name.as_string()); + narrow_date_fields[index] = cldr.unique_strings.ensure(narrow_name.as_string()); }); - locale.long_date_fields = locale_data.unique_date_field_lists.ensure(move(long_date_fields)); - locale.short_date_fields = locale_data.unique_date_field_lists.ensure(move(short_date_fields)); - locale.narrow_date_fields = locale_data.unique_date_field_lists.ensure(move(narrow_date_fields)); + locale.long_date_fields = cldr.unique_date_field_lists.ensure(move(long_date_fields)); + locale.short_date_fields = cldr.unique_date_field_lists.ensure(move(short_date_fields)); + locale.narrow_date_fields = cldr.unique_date_field_lists.ensure(move(narrow_date_fields)); return {}; } -static ErrorOr parse_number_system_keywords(String locale_numbers_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_number_system_keywords(String locale_numbers_path, CLDR& cldr, LocaleData& locale) { LexicalPath numbers_path(move(locale_numbers_path)); numbers_path = numbers_path.append("numbers.json"sv); @@ -780,10 +780,10 @@ static ErrorOr parse_number_system_keywords(String locale_numbers_path, Un KeywordList keywords {}; auto append_numbering_system = [&](String system_name) { - if (auto system_alias = find_keyword_alias("nu"sv, system_name, locale_data); system_alias.has_value()) + if (auto system_alias = find_keyword_alias("nu"sv, system_name, cldr); system_alias.has_value()) system_name = system_alias.release_value(); - auto index = locale_data.unique_strings.ensure(move(system_name)); + auto index = cldr.unique_strings.ensure(move(system_name)); if (!keywords.contains_slow(index)) keywords.append(move(index)); }; @@ -800,11 +800,11 @@ static ErrorOr parse_number_system_keywords(String locale_numbers_path, Un append_numbering_system(value.as_string()); }); - locale.number_system_keywords = locale_data.unique_keyword_lists.ensure(move(keywords)); + locale.number_system_keywords = cldr.unique_keyword_lists.ensure(move(keywords)); return {}; } -static ErrorOr parse_calendar_keywords(String locale_dates_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_calendar_keywords(String locale_dates_path, CLDR& cldr, LocaleData& locale) { auto calendars_iterator = TRY(path_to_dir_iterator(locale_dates_path, {})); KeywordList keywords {}; @@ -828,22 +828,22 @@ static ErrorOr parse_calendar_keywords(String locale_dates_path, UnicodeLo if (calendar_name == "generic"sv) return; - if (auto calendar_alias = find_keyword_alias("ca"sv, calendar_name, locale_data); calendar_alias.has_value()) + if (auto calendar_alias = find_keyword_alias("ca"sv, calendar_name, cldr); calendar_alias.has_value()) calendar_name = calendar_alias.release_value(); - keywords.append(locale_data.unique_strings.ensure(calendar_name)); + keywords.append(cldr.unique_strings.ensure(calendar_name)); }); } - locale.calendar_keywords = locale_data.unique_keyword_lists.ensure(move(keywords)); + locale.calendar_keywords = cldr.unique_keyword_lists.ensure(move(keywords)); return {}; } -static void fill_in_collation_keywords(UnicodeLocaleData& locale_data, Locale& locale) +static void fill_in_collation_keywords(CLDR& cldr, LocaleData& locale) { // FIXME: If collation data becomes available in the CLDR, parse per-locale ordering from there. auto create_list_with_default_first = [&](auto key, auto default_value) { - auto& values = locale_data.keywords.find(key)->value; + auto& values = cldr.keywords.find(key)->value; quick_sort(values, [&](auto const& lhs, auto const& rhs) { if (lhs == default_value) @@ -857,9 +857,9 @@ static void fill_in_collation_keywords(UnicodeLocaleData& locale_data, Locale& l keywords.ensure_capacity(values.size()); for (auto const& value : values) - keywords.append(locale_data.unique_strings.ensure(value)); + keywords.append(cldr.unique_strings.ensure(value)); - return locale_data.unique_keyword_lists.ensure(move(keywords)); + return cldr.unique_keyword_lists.ensure(move(keywords)); }; static auto kf_index = create_list_with_default_first("kf"sv, "upper"sv); @@ -869,7 +869,7 @@ static void fill_in_collation_keywords(UnicodeLocaleData& locale_data, Locale& l locale.collation_numeric_keywords = kn_index; } -static ErrorOr parse_default_content_locales(String core_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_default_content_locales(String core_path, CLDR& cldr) { LexicalPath default_content_path(move(core_path)); default_content_path = default_content_path.append("defaultContent.json"sv); @@ -882,7 +882,7 @@ static ErrorOr parse_default_content_locales(String core_path, UnicodeLoca StringView default_locale = locale; while (true) { - if (locale_data.locales.contains(default_locale)) + if (cldr.locales.contains(default_locale)) break; auto pos = default_locale.find_last('-'); @@ -893,13 +893,13 @@ static ErrorOr parse_default_content_locales(String core_path, UnicodeLoca } if (default_locale != locale) - locale_data.locale_aliases.append({ default_locale, move(locale) }); + cldr.locale_aliases.append({ default_locale, move(locale) }); }); return {}; } -static ErrorOr define_aliases_without_scripts(UnicodeLocaleData& locale_data) +static ErrorOr define_aliases_without_scripts(CLDR& cldr) { // From ECMA-402: https://tc39.es/ecma402/#sec-internal-slots // @@ -910,40 +910,40 @@ static ErrorOr define_aliases_without_scripts(UnicodeLocaleData& locale_da // care to handle when the locale itself or the locale without a script subtag are an alias // by way of default-content locales. auto find_alias = [&](auto const& locale) { - return locale_data.locale_aliases.find_if([&](auto const& alias) { return locale == alias.alias; }); + return cldr.locale_aliases.find_if([&](auto const& alias) { return locale == alias.alias; }); }; auto append_alias_without_script = [&](auto const& locale) -> ErrorOr { - auto parsed_locale = TRY(CanonicalLanguageID::parse(locale_data.unique_strings, locale)); + auto parsed_locale = TRY(CanonicalLanguageID::parse(cldr.unique_strings, locale)); if ((parsed_locale.language == 0) || (parsed_locale.script == 0) || (parsed_locale.region == 0)) return {}; auto locale_without_script = String::formatted("{}-{}", - locale_data.unique_strings.get(parsed_locale.language), - locale_data.unique_strings.get(parsed_locale.region)); + cldr.unique_strings.get(parsed_locale.language), + cldr.unique_strings.get(parsed_locale.region)); - if (locale_data.locales.contains(locale_without_script)) + if (cldr.locales.contains(locale_without_script)) return {}; - if (find_alias(locale_without_script) != locale_data.locale_aliases.end()) + if (find_alias(locale_without_script) != cldr.locale_aliases.end()) return {}; - if (auto it = find_alias(locale); it != locale_data.locale_aliases.end()) - locale_data.locale_aliases.append({ it->name, locale_without_script }); + if (auto it = find_alias(locale); it != cldr.locale_aliases.end()) + cldr.locale_aliases.append({ it->name, locale_without_script }); else - locale_data.locale_aliases.append({ locale, locale_without_script }); + cldr.locale_aliases.append({ locale, locale_without_script }); return {}; }; - for (auto const& locale : locale_data.locales) + for (auto const& locale : cldr.locales) TRY(append_alias_without_script(locale.key)); - for (auto const& locale : locale_data.locale_aliases) + for (auto const& locale : cldr.locale_aliases) TRY(append_alias_without_script(locale.alias)); return {}; } -static ErrorOr parse_all_locales(String bcp47_path, String core_path, String locale_names_path, String misc_path, String numbers_path, String dates_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_all_locales(String bcp47_path, String core_path, String locale_names_path, String misc_path, String numbers_path, String dates_path, CLDR& cldr) { auto bcp47_iterator = TRY(path_to_dir_iterator(move(bcp47_path), "bcp47"sv)); auto identity_iterator = TRY(path_to_dir_iterator(locale_names_path)); @@ -957,17 +957,17 @@ static ErrorOr parse_all_locales(String bcp47_path, String core_path, Stri core_supplemental_path = core_supplemental_path.append("supplemental"sv); VERIFY(Core::File::is_directory(core_supplemental_path.string())); - TRY(parse_core_aliases(core_supplemental_path.string(), locale_data)); - TRY(parse_likely_subtags(core_supplemental_path.string(), locale_data)); + TRY(parse_core_aliases(core_supplemental_path.string(), cldr)); + TRY(parse_likely_subtags(core_supplemental_path.string(), cldr)); auto remove_variants_from_path = [&](String path) -> ErrorOr { - auto parsed_locale = TRY(CanonicalLanguageID::parse(locale_data.unique_strings, LexicalPath::basename(path))); + auto parsed_locale = TRY(CanonicalLanguageID::parse(cldr.unique_strings, LexicalPath::basename(path))); StringBuilder builder; - builder.append(locale_data.unique_strings.get(parsed_locale.language)); - if (auto script = locale_data.unique_strings.get(parsed_locale.script); !script.is_empty()) + builder.append(cldr.unique_strings.get(parsed_locale.language)); + if (auto script = cldr.unique_strings.get(parsed_locale.script); !script.is_empty()) builder.appendff("-{}", script); - if (auto region = locale_data.unique_strings.get(parsed_locale.region); !region.is_empty()) + if (auto region = cldr.unique_strings.get(parsed_locale.region); !region.is_empty()) builder.appendff("-{}", region); return builder.build(); @@ -977,71 +977,71 @@ static ErrorOr parse_all_locales(String bcp47_path, String core_path, Stri auto locale_path = TRY(next_path_from_dir_iterator(identity_iterator)); auto language = TRY(remove_variants_from_path(locale_path)); - auto& locale = locale_data.locales.ensure(language); - TRY(parse_identity(locale_path, locale_data, locale)); + auto& locale = cldr.locales.ensure(language); + TRY(parse_identity(locale_path, cldr, locale)); } while (preprocess_iterator.has_next()) { auto locale_path = TRY(next_path_from_dir_iterator(preprocess_iterator)); - TRY(preprocess_languages(locale_path, locale_data)); + TRY(preprocess_languages(locale_path, cldr)); } - quick_sort(locale_data.languages); - quick_sort(locale_data.territories); - quick_sort(locale_data.scripts); + quick_sort(cldr.languages); + quick_sort(cldr.territories); + quick_sort(cldr.scripts); while (bcp47_iterator.has_next()) { auto bcp47_path = TRY(next_path_from_dir_iterator(bcp47_iterator)); - TRY(parse_unicode_extension_keywords(move(bcp47_path), locale_data)); + TRY(parse_unicode_extension_keywords(move(bcp47_path), cldr)); } while (locale_names_iterator.has_next()) { auto locale_path = TRY(next_path_from_dir_iterator(locale_names_iterator)); auto language = TRY(remove_variants_from_path(locale_path)); - auto& locale = locale_data.locales.ensure(language); - TRY(parse_locale_display_patterns(locale_path, locale_data, locale)); - TRY(parse_locale_languages(locale_path, locale_data, locale)); - TRY(parse_locale_territories(locale_path, locale_data, locale)); - TRY(parse_locale_scripts(locale_path, locale_data, locale)); - TRY(parse_locale_calendars(locale_path, locale_data, locale)); + auto& locale = cldr.locales.ensure(language); + TRY(parse_locale_display_patterns(locale_path, cldr, locale)); + TRY(parse_locale_languages(locale_path, cldr, locale)); + TRY(parse_locale_territories(locale_path, cldr, locale)); + TRY(parse_locale_scripts(locale_path, cldr, locale)); + TRY(parse_locale_calendars(locale_path, cldr, locale)); } while (misc_iterator.has_next()) { auto misc_path = TRY(next_path_from_dir_iterator(misc_iterator)); auto language = TRY(remove_variants_from_path(misc_path)); - auto& locale = locale_data.locales.ensure(language); - TRY(parse_locale_list_patterns(misc_path, locale_data, locale)); - TRY(parse_locale_layout(misc_path, locale_data, locale)); + auto& locale = cldr.locales.ensure(language); + TRY(parse_locale_list_patterns(misc_path, cldr, locale)); + TRY(parse_locale_layout(misc_path, cldr, locale)); } while (numbers_iterator.has_next()) { auto numbers_path = TRY(next_path_from_dir_iterator(numbers_iterator)); auto language = TRY(remove_variants_from_path(numbers_path)); - auto& locale = locale_data.locales.ensure(language); - TRY(parse_locale_currencies(numbers_path, locale_data, locale)); - TRY(parse_number_system_keywords(numbers_path, locale_data, locale)); - fill_in_collation_keywords(locale_data, locale); + auto& locale = cldr.locales.ensure(language); + TRY(parse_locale_currencies(numbers_path, cldr, locale)); + TRY(parse_number_system_keywords(numbers_path, cldr, locale)); + fill_in_collation_keywords(cldr, locale); } while (dates_iterator.has_next()) { auto dates_path = TRY(next_path_from_dir_iterator(dates_iterator)); auto language = TRY(remove_variants_from_path(dates_path)); - auto& locale = locale_data.locales.ensure(language); - TRY(parse_locale_date_fields(dates_path, locale_data, locale)); - TRY(parse_calendar_keywords(dates_path, locale_data, locale)); + auto& locale = cldr.locales.ensure(language); + TRY(parse_locale_date_fields(dates_path, cldr, locale)); + TRY(parse_calendar_keywords(dates_path, cldr, locale)); } - TRY(parse_default_content_locales(move(core_path), locale_data)); - TRY(define_aliases_without_scripts(locale_data)); + TRY(parse_default_content_locales(move(core_path), cldr)); + TRY(define_aliases_without_scripts(cldr)); return {}; } -static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, UnicodeLocaleData& locale_data) +static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, CLDR& cldr) { StringBuilder builder; SourceGenerator generator { builder }; @@ -1054,25 +1054,25 @@ static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& namespace Unicode { )~~~"); - auto locales = locale_data.locales.keys(); - auto keywords = locale_data.keywords.keys(); + auto locales = cldr.locales.keys(); + auto keywords = cldr.keywords.keys(); - generate_enum(generator, format_identifier, "Locale"sv, "None"sv, locales, locale_data.locale_aliases); - generate_enum(generator, format_identifier, "Language"sv, {}, locale_data.languages); - generate_enum(generator, format_identifier, "Territory"sv, {}, locale_data.territories); - generate_enum(generator, format_identifier, "ScriptTag"sv, {}, locale_data.scripts); - generate_enum(generator, format_identifier, "Currency"sv, {}, locale_data.currencies); - generate_enum(generator, format_identifier, "DateField"sv, {}, locale_data.date_fields, locale_data.date_field_aliases); - generate_enum(generator, format_identifier, "Variant"sv, {}, locale_data.variants); - generate_enum(generator, format_identifier, "ListPatternType"sv, {}, locale_data.list_pattern_types); - generate_enum(generator, format_identifier, "CharacterOrder"sv, {}, locale_data.character_orders); + generate_enum(generator, format_identifier, "Locale"sv, "None"sv, locales, cldr.locale_aliases); + generate_enum(generator, format_identifier, "Language"sv, {}, cldr.languages); + generate_enum(generator, format_identifier, "Territory"sv, {}, cldr.territories); + generate_enum(generator, format_identifier, "ScriptTag"sv, {}, cldr.scripts); + generate_enum(generator, format_identifier, "Currency"sv, {}, cldr.currencies); + generate_enum(generator, format_identifier, "DateField"sv, {}, cldr.date_fields, cldr.date_field_aliases); + generate_enum(generator, format_identifier, "Variant"sv, {}, cldr.variants); + generate_enum(generator, format_identifier, "ListPatternType"sv, {}, cldr.list_pattern_types); + generate_enum(generator, format_identifier, "CharacterOrder"sv, {}, cldr.character_orders); generate_enum(generator, format_identifier, "Key"sv, {}, keywords); - for (auto& keyword : locale_data.keywords) { - auto const& keyword_name = locale_data.keyword_names.find(keyword.key)->value; + for (auto& keyword : cldr.keywords) { + auto const& keyword_name = cldr.keyword_names.find(keyword.key)->value; auto enum_name = String::formatted("Keyword{}", format_identifier({}, keyword_name)); - if (auto aliases = locale_data.keyword_aliases.find(keyword.key); aliases != locale_data.keyword_aliases.end()) + if (auto aliases = cldr.keyword_aliases.find(keyword.key); aliases != cldr.keyword_aliases.end()) generate_enum(generator, format_identifier, enum_name, {}, keyword.value, aliases->value); else generate_enum(generator, format_identifier, enum_name, {}, keyword.value); @@ -1086,14 +1086,14 @@ namespace Unicode { return {}; } -static ErrorOr generate_unicode_locale_implementation(Core::Stream::BufferedFile& file, UnicodeLocaleData& locale_data) +static ErrorOr generate_unicode_locale_implementation(Core::Stream::BufferedFile& file, CLDR& cldr) { StringBuilder builder; SourceGenerator generator { builder }; generator.set("string_index_type"sv, s_string_index_type); - generator.set("locales_size"sv, String::number(locale_data.locales.size())); - generator.set("territories_size", String::number(locale_data.territories.size())); - generator.set("variants_size", String::number(locale_data.max_variant_size)); + generator.set("locales_size"sv, String::number(cldr.locales.size())); + generator.set("territories_size", String::number(cldr.territories.size())); + generator.set("variants_size", String::number(cldr.max_variant_size)); generator.append(R"~~~( #include @@ -1110,7 +1110,7 @@ static ErrorOr generate_unicode_locale_implementation(Core::Stream::Buffer namespace Unicode { )~~~"); - locale_data.unique_strings.generate(generator); + cldr.unique_strings.generate(generator); generator.append(R"~~~( struct DisplayPatternImpl { @@ -1141,21 +1141,21 @@ struct TextLayout { }; )~~~"); - generate_available_values(generator, "get_available_calendars"sv, locale_data.keywords.find("ca"sv)->value, locale_data.keyword_aliases.find("ca"sv)->value, + generate_available_values(generator, "get_available_calendars"sv, cldr.keywords.find("ca"sv)->value, cldr.keyword_aliases.find("ca"sv)->value, [](auto calendar) { // FIXME: Remove this filter when we support all calendars. return calendar.is_one_of("gregory"sv, "iso8601"sv); }); - generate_available_values(generator, "get_available_collation_case_orderings"sv, locale_data.keywords.find("kf"sv)->value, locale_data.keyword_aliases.find("kf"sv)->value); - generate_available_values(generator, "get_available_collation_numeric_orderings"sv, locale_data.keywords.find("kn"sv)->value, locale_data.keyword_aliases.find("kn"sv)->value); - generate_available_values(generator, "get_available_collation_types"sv, locale_data.keywords.find("co"sv)->value, locale_data.keyword_aliases.find("co"sv)->value, + generate_available_values(generator, "get_available_collation_case_orderings"sv, cldr.keywords.find("kf"sv)->value, cldr.keyword_aliases.find("kf"sv)->value); + generate_available_values(generator, "get_available_collation_numeric_orderings"sv, cldr.keywords.find("kn"sv)->value, cldr.keyword_aliases.find("kn"sv)->value); + generate_available_values(generator, "get_available_collation_types"sv, cldr.keywords.find("co"sv)->value, cldr.keyword_aliases.find("co"sv)->value, [](auto collation) { // FIXME: Remove this filter when we support all collation types. return collation == "default"sv; }); - generate_available_values(generator, "get_available_hour_cycles"sv, locale_data.keywords.find("hc"sv)->value); - generate_available_values(generator, "get_available_number_systems"sv, locale_data.keywords.find("nu"sv)->value); - generate_available_values(generator, "get_available_currencies"sv, locale_data.currencies); + generate_available_values(generator, "get_available_hour_cycles"sv, cldr.keywords.find("hc"sv)->value); + generate_available_values(generator, "get_available_number_systems"sv, cldr.keywords.find("nu"sv)->value); + generate_available_values(generator, "get_available_currencies"sv, cldr.currencies); generator.append(R"~~~( Span get_available_keyword_values(StringView key) @@ -1183,17 +1183,17 @@ Span get_available_keyword_values(StringView key) } )~~~"); - locale_data.unique_display_patterns.generate(generator, "DisplayPatternImpl"sv, "s_display_patterns"sv, 30); - locale_data.unique_language_lists.generate(generator, s_string_index_type, "s_language_lists"sv); - locale_data.unique_territory_lists.generate(generator, s_string_index_type, "s_territory_lists"sv); - locale_data.unique_script_lists.generate(generator, s_string_index_type, "s_script_lists"sv); - locale_data.unique_currency_lists.generate(generator, s_string_index_type, "s_currency_lists"sv); - locale_data.unique_calendar_lists.generate(generator, s_string_index_type, "s_calendar_lists"sv); - locale_data.unique_date_field_lists.generate(generator, s_string_index_type, "s_date_field_lists"sv); - locale_data.unique_keyword_lists.generate(generator, s_string_index_type, "s_keyword_lists"sv); - locale_data.unique_list_patterns.generate(generator, "Patterns"sv, "s_list_patterns"sv, 10); - locale_data.unique_list_pattern_lists.generate(generator, s_list_pattern_index_type, "s_list_pattern_lists"sv); - locale_data.unique_text_layouts.generate(generator, "TextLayout"sv, "s_text_layouts"sv, 30); + cldr.unique_display_patterns.generate(generator, "DisplayPatternImpl"sv, "s_display_patterns"sv, 30); + cldr.unique_language_lists.generate(generator, s_string_index_type, "s_language_lists"sv); + cldr.unique_territory_lists.generate(generator, s_string_index_type, "s_territory_lists"sv); + cldr.unique_script_lists.generate(generator, s_string_index_type, "s_script_lists"sv); + cldr.unique_currency_lists.generate(generator, s_string_index_type, "s_currency_lists"sv); + cldr.unique_calendar_lists.generate(generator, s_string_index_type, "s_calendar_lists"sv); + cldr.unique_date_field_lists.generate(generator, s_string_index_type, "s_date_field_lists"sv); + cldr.unique_keyword_lists.generate(generator, s_string_index_type, "s_keyword_lists"sv); + cldr.unique_list_patterns.generate(generator, "Patterns"sv, "s_list_patterns"sv, 10); + cldr.unique_list_pattern_lists.generate(generator, s_list_pattern_index_type, "s_list_pattern_lists"sv); + cldr.unique_text_layouts.generate(generator, "TextLayout"sv, "s_text_layouts"sv, 30); auto append_index = [&](auto index) { generator.append(String::formatted(", {}", index)); @@ -1236,27 +1236,27 @@ static constexpr Array<@type@, @size@> @name@ { {)~~~"); generator.append(" } };"); }; - auto locales = locale_data.locales.keys(); + auto locales = cldr.locales.keys(); quick_sort(locales); - append_mapping(locales, locale_data.locales, s_display_pattern_index_type, "s_locale_display_patterns"sv, [&](auto const& locale) { return locale.display_patterns; }); - append_mapping(locales, locale_data.locales, s_language_list_index_type, "s_languages"sv, [&](auto const& locale) { return locale.languages; }); - append_mapping(locales, locale_data.locales, s_territory_list_index_type, "s_territories"sv, [&](auto const& locale) { return locale.territories; }); - append_mapping(locales, locale_data.locales, s_script_list_index_type, "s_scripts"sv, [&](auto const& locale) { return locale.scripts; }); - append_mapping(locales, locale_data.locales, s_currency_list_index_type, "s_long_currencies"sv, [&](auto const& locale) { return locale.long_currencies; }); - append_mapping(locales, locale_data.locales, s_currency_list_index_type, "s_short_currencies"sv, [&](auto const& locale) { return locale.short_currencies; }); - append_mapping(locales, locale_data.locales, s_currency_list_index_type, "s_narrow_currencies"sv, [&](auto const& locale) { return locale.narrow_currencies; }); - append_mapping(locales, locale_data.locales, s_currency_list_index_type, "s_numeric_currencies"sv, [&](auto const& locale) { return locale.numeric_currencies; }); - append_mapping(locales, locale_data.locales, s_calendar_list_index_type, "s_calendars"sv, [&](auto const& locale) { return locale.calendars; }); - append_mapping(locales, locale_data.locales, s_date_field_list_index_type, "s_long_date_fields"sv, [&](auto const& locale) { return locale.long_date_fields; }); - append_mapping(locales, locale_data.locales, s_date_field_list_index_type, "s_short_date_fields"sv, [&](auto const& locale) { return locale.short_date_fields; }); - append_mapping(locales, locale_data.locales, s_date_field_list_index_type, "s_narrow_date_fields"sv, [&](auto const& locale) { return locale.narrow_date_fields; }); - append_mapping(locales, locale_data.locales, s_keyword_list_index_type, "s_calendar_keywords"sv, [&](auto const& locale) { return locale.calendar_keywords; }); - append_mapping(locales, locale_data.locales, s_keyword_list_index_type, "s_collation_case_keywords"sv, [&](auto const& locale) { return locale.collation_case_keywords; }); - append_mapping(locales, locale_data.locales, s_keyword_list_index_type, "s_collation_numeric_keywords"sv, [&](auto const& locale) { return locale.collation_numeric_keywords; }); - append_mapping(locales, locale_data.locales, s_keyword_list_index_type, "s_number_system_keywords"sv, [&](auto const& locale) { return locale.number_system_keywords; }); - append_mapping(locales, locale_data.locales, s_list_pattern_list_index_type, "s_locale_list_patterns"sv, [&](auto const& locale) { return locale.list_patterns; }); - append_mapping(locales, locale_data.locales, s_text_layout_index_type, "s_locale_text_layouts"sv, [&](auto const& locale) { return locale.text_layout; }); + append_mapping(locales, cldr.locales, s_display_pattern_index_type, "s_locale_display_patterns"sv, [&](auto const& locale) { return locale.display_patterns; }); + append_mapping(locales, cldr.locales, s_language_list_index_type, "s_languages"sv, [&](auto const& locale) { return locale.languages; }); + append_mapping(locales, cldr.locales, s_territory_list_index_type, "s_territories"sv, [&](auto const& locale) { return locale.territories; }); + append_mapping(locales, cldr.locales, s_script_list_index_type, "s_scripts"sv, [&](auto const& locale) { return locale.scripts; }); + append_mapping(locales, cldr.locales, s_currency_list_index_type, "s_long_currencies"sv, [&](auto const& locale) { return locale.long_currencies; }); + append_mapping(locales, cldr.locales, s_currency_list_index_type, "s_short_currencies"sv, [&](auto const& locale) { return locale.short_currencies; }); + append_mapping(locales, cldr.locales, s_currency_list_index_type, "s_narrow_currencies"sv, [&](auto const& locale) { return locale.narrow_currencies; }); + append_mapping(locales, cldr.locales, s_currency_list_index_type, "s_numeric_currencies"sv, [&](auto const& locale) { return locale.numeric_currencies; }); + append_mapping(locales, cldr.locales, s_calendar_list_index_type, "s_calendars"sv, [&](auto const& locale) { return locale.calendars; }); + append_mapping(locales, cldr.locales, s_date_field_list_index_type, "s_long_date_fields"sv, [&](auto const& locale) { return locale.long_date_fields; }); + append_mapping(locales, cldr.locales, s_date_field_list_index_type, "s_short_date_fields"sv, [&](auto const& locale) { return locale.short_date_fields; }); + append_mapping(locales, cldr.locales, s_date_field_list_index_type, "s_narrow_date_fields"sv, [&](auto const& locale) { return locale.narrow_date_fields; }); + append_mapping(locales, cldr.locales, s_keyword_list_index_type, "s_calendar_keywords"sv, [&](auto const& locale) { return locale.calendar_keywords; }); + append_mapping(locales, cldr.locales, s_keyword_list_index_type, "s_collation_case_keywords"sv, [&](auto const& locale) { return locale.collation_case_keywords; }); + append_mapping(locales, cldr.locales, s_keyword_list_index_type, "s_collation_numeric_keywords"sv, [&](auto const& locale) { return locale.collation_numeric_keywords; }); + append_mapping(locales, cldr.locales, s_keyword_list_index_type, "s_number_system_keywords"sv, [&](auto const& locale) { return locale.number_system_keywords; }); + append_mapping(locales, cldr.locales, s_list_pattern_list_index_type, "s_locale_list_patterns"sv, [&](auto const& locale) { return locale.list_patterns; }); + append_mapping(locales, cldr.locales, s_text_layout_index_type, "s_locale_text_layouts"sv, [&](auto const& locale) { return locale.text_layout; }); generator.append(R"~~~( @@ -1314,8 +1314,8 @@ static constexpr Array s_@name@ { { )~~~"); quick_sort(mappings, [&](auto const& lhs, auto const& rhs) { - auto const& lhs_language = locale_data.unique_strings.get(lhs.key.language); - auto const& rhs_language = locale_data.unique_strings.get(rhs.key.language); + auto const& lhs_language = cldr.unique_strings.get(lhs.key.language); + auto const& rhs_language = cldr.unique_strings.get(rhs.key.language); // Sort the keys such that "und" language tags are at the end, as those are less specific. if (lhs_language.starts_with("und"sv) && !rhs_language.starts_with("und"sv)) @@ -1346,8 +1346,8 @@ static constexpr Array s_@name@ { { generator.append("} };\n"); }; - append_complex_mapping("complex_alias"sv, locale_data.complex_mappings); - append_complex_mapping("likely_subtags"sv, locale_data.likely_subtags); + append_complex_mapping("complex_alias"sv, cldr.complex_mappings); + append_complex_mapping("likely_subtags"sv, cldr.likely_subtags); generator.append(R"~~~( static LanguageMapping const* resolve_likely_subtag(LanguageID const& language_id) @@ -1498,39 +1498,39 @@ Optional get_locale_@enum_snake@_mapping(StringView locale, StringVi generate_value_from_string(generator, "resolve_{}_alias"sv, s_string_index_type, enum_snake, move(hashes), options); }; - append_from_string("Locale"sv, "locale"sv, locale_data.locales.keys(), locale_data.locale_aliases); + append_from_string("Locale"sv, "locale"sv, cldr.locales.keys(), cldr.locale_aliases); - append_from_string("Language"sv, "language"sv, locale_data.languages); + append_from_string("Language"sv, "language"sv, cldr.languages); append_mapping_search("language"sv, "language"sv, "s_languages"sv, "s_language_lists"sv); - append_alias_search("language"sv, locale_data.language_aliases); + append_alias_search("language"sv, cldr.language_aliases); - append_from_string("Territory"sv, "territory"sv, locale_data.territories); + append_from_string("Territory"sv, "territory"sv, cldr.territories); append_mapping_search("territory"sv, "territory"sv, "s_territories"sv, "s_territory_lists"sv); - append_alias_search("territory"sv, locale_data.territory_aliases); + append_alias_search("territory"sv, cldr.territory_aliases); - append_from_string("ScriptTag"sv, "script_tag"sv, locale_data.scripts); + append_from_string("ScriptTag"sv, "script_tag"sv, cldr.scripts); append_mapping_search("script"sv, "script_tag"sv, "s_scripts"sv, "s_script_lists"sv); - append_alias_search("script_tag"sv, locale_data.script_aliases); + append_alias_search("script_tag"sv, cldr.script_aliases); - append_from_string("Currency"sv, "currency"sv, locale_data.currencies); + append_from_string("Currency"sv, "currency"sv, cldr.currencies); append_mapping_search("long_currency"sv, "currency"sv, "s_long_currencies"sv, "s_currency_lists"sv); append_mapping_search("short_currency"sv, "currency"sv, "s_short_currencies"sv, "s_currency_lists"sv); append_mapping_search("narrow_currency"sv, "currency"sv, "s_narrow_currencies"sv, "s_currency_lists"sv); append_mapping_search("numeric_currency"sv, "currency"sv, "s_numeric_currencies"sv, "s_currency_lists"sv); - append_from_string("DateField"sv, "date_field"sv, locale_data.date_fields, locale_data.date_field_aliases); + append_from_string("DateField"sv, "date_field"sv, cldr.date_fields, cldr.date_field_aliases); append_mapping_search("long_date_field"sv, "date_field"sv, "s_long_date_fields"sv, "s_date_field_lists"sv); append_mapping_search("short_date_field"sv, "date_field"sv, "s_short_date_fields"sv, "s_date_field_lists"sv); append_mapping_search("narrow_date_field"sv, "date_field"sv, "s_narrow_date_fields"sv, "s_date_field_lists"sv); - append_from_string("Key"sv, "key"sv, locale_data.keywords.keys()); + append_from_string("Key"sv, "key"sv, cldr.keywords.keys()); - for (auto const& keyword : locale_data.keywords) { - auto const& keyword_name = locale_data.keyword_names.find(keyword.key)->value; + for (auto const& keyword : cldr.keywords) { + auto const& keyword_name = cldr.keyword_names.find(keyword.key)->value; auto enum_name = String::formatted("Keyword{}", format_identifier({}, keyword_name)); auto enum_snake = String::formatted("keyword_{}", keyword.key); - if (auto aliases = locale_data.keyword_aliases.find(keyword.key); aliases != locale_data.keyword_aliases.end()) + if (auto aliases = cldr.keyword_aliases.find(keyword.key); aliases != cldr.keyword_aliases.end()) append_from_string(enum_name, enum_snake, keyword.value, aliases->value); else append_from_string(enum_name, enum_snake, keyword.value); @@ -1538,13 +1538,13 @@ Optional get_locale_@enum_snake@_mapping(StringView locale, StringVi append_mapping_search("calendar"sv, "keyword_ca"sv, "s_calendars"sv, "s_calendar_lists"sv); - append_alias_search("variant"sv, locale_data.variant_aliases); - append_alias_search("subdivision"sv, locale_data.subdivision_aliases); + append_alias_search("variant"sv, cldr.variant_aliases); + append_alias_search("subdivision"sv, cldr.subdivision_aliases); - append_from_string("ListPatternType"sv, "list_pattern_type"sv, locale_data.list_pattern_types); + append_from_string("ListPatternType"sv, "list_pattern_type"sv, cldr.list_pattern_types); - append_from_string("CharacterOrder"sv, "character_order"sv, locale_data.character_orders); - generate_value_to_string(generator, "{}_to_string"sv, "CharacterOrder"sv, "character_order"sv, format_identifier, locale_data.character_orders); + append_from_string("CharacterOrder"sv, "character_order"sv, cldr.character_orders); + generate_value_to_string(generator, "{}_to_string"sv, "CharacterOrder"sv, "character_order"sv, format_identifier, cldr.character_orders); generator.append(R"~~~( static Span<@string_index_type@ const> find_keyword_indices(StringView locale, StringView key) @@ -1801,11 +1801,11 @@ ErrorOr serenity_main(Main::Arguments arguments) auto generated_header_file = TRY(open_file(generated_header_path, Core::Stream::OpenMode::Write)); auto generated_implementation_file = TRY(open_file(generated_implementation_path, Core::Stream::OpenMode::Write)); - UnicodeLocaleData locale_data; - TRY(parse_all_locales(bcp47_path, core_path, locale_names_path, misc_path, numbers_path, dates_path, locale_data)); + CLDR cldr; + TRY(parse_all_locales(bcp47_path, core_path, locale_names_path, misc_path, numbers_path, dates_path, cldr)); - TRY(generate_unicode_locale_header(*generated_header_file, locale_data)); - TRY(generate_unicode_locale_implementation(*generated_implementation_file, locale_data)); + TRY(generate_unicode_locale_header(*generated_header_file, cldr)); + TRY(generate_unicode_locale_implementation(*generated_implementation_file, cldr)); return 0; } diff --git a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateNumberFormatData.cpp b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateNumberFormatData.cpp index d757295f7d..650daf075c 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateNumberFormatData.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateNumberFormatData.cpp @@ -236,13 +236,13 @@ struct AK::Traits : public GenericTraits { static unsigned hash(Unit const& u) { return u.hash(); } }; -struct Locale { +struct LocaleData { Vector number_systems; HashMap units {}; u8 minimum_grouping_digits { 0 }; }; -struct UnicodeLocaleData { +struct CLDR { UniqueStringStorage unique_strings; UniqueStorage unique_formats; UniqueStorage unique_format_lists; @@ -253,11 +253,11 @@ struct UnicodeLocaleData { HashMap> number_system_digits; Vector number_systems; - HashMap locales; + HashMap locales; size_t max_identifier_count { 0 }; }; -static ErrorOr parse_number_system_digits(String core_supplemental_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_number_system_digits(String core_supplemental_path, CLDR& cldr) { LexicalPath number_systems_path(move(core_supplemental_path)); number_systems_path = number_systems_path.append("numberingSystems.json"sv); @@ -276,20 +276,20 @@ static ErrorOr parse_number_system_digits(String core_supplemental_path, U Utf8View utf8_digits { digits }; VERIFY(utf8_digits.length() == 10); - auto& number_system_digits = locale_data.number_system_digits.ensure(number_system); + auto& number_system_digits = cldr.number_system_digits.ensure(number_system); size_t index = 0; for (u32 digit : utf8_digits) number_system_digits[index++] = digit; - if (!locale_data.number_systems.contains_slow(number_system)) - locale_data.number_systems.append(number_system); + if (!cldr.number_systems.contains_slow(number_system)) + cldr.number_systems.append(number_system); }); return {}; } -static String parse_identifiers(String pattern, StringView replacement, UnicodeLocaleData& locale_data, NumberFormat& format) +static String parse_identifiers(String pattern, StringView replacement, CLDR& cldr, NumberFormat& format) { static constexpr Utf8View whitespace { "\u0020\u00a0\u200f"sv }; @@ -323,7 +323,7 @@ static String parse_identifiers(String pattern, StringView replacement, UnicodeL utf8_pattern = utf8_pattern.trim(whitespace); auto identifier = utf8_pattern.as_string().replace("'.'"sv, "."sv, ReplaceMode::FirstOnly); - auto identifier_index = locale_data.unique_strings.ensure(move(identifier)); + auto identifier_index = cldr.unique_strings.ensure(move(identifier)); size_t replacement_index = 0; if (auto index = format.identifier_indices.find_first_index(identifier_index); index.has_value()) { @@ -332,7 +332,7 @@ static String parse_identifiers(String pattern, StringView replacement, UnicodeL replacement_index = format.identifier_indices.size(); format.identifier_indices.append(identifier_index); - locale_data.max_identifier_count = max(locale_data.max_identifier_count, format.identifier_indices.size()); + cldr.max_identifier_count = max(cldr.max_identifier_count, format.identifier_indices.size()); } pattern = String::formatted("{}{{{}:{}}}{}", @@ -343,7 +343,7 @@ static String parse_identifiers(String pattern, StringView replacement, UnicodeL } } -static void parse_number_pattern(Vector patterns, UnicodeLocaleData& locale_data, NumberFormatType type, NumberFormat& format, NumberSystem* number_system_for_groupings = nullptr) +static void parse_number_pattern(Vector patterns, CLDR& cldr, NumberFormatType type, NumberFormat& format, NumberSystem* number_system_for_groupings = nullptr) { // https://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns // https://cldr.unicode.org/translation/number-currency-formats/number-and-currency-patterns @@ -401,33 +401,33 @@ static void parse_number_pattern(Vector patterns, UnicodeLocaleData& loc } if (type == NumberFormatType::Compact) - return parse_identifiers(move(pattern), "compactIdentifier"sv, locale_data, format); + return parse_identifiers(move(pattern), "compactIdentifier"sv, cldr, format); return pattern; }; auto zero_format = replace_patterns(move(patterns[0])); - format.positive_format_index = locale_data.unique_strings.ensure(String::formatted("{{plusSign}}{}", zero_format)); + format.positive_format_index = cldr.unique_strings.ensure(String::formatted("{{plusSign}}{}", zero_format)); if (patterns.size() == 2) { auto negative_format = replace_patterns(move(patterns[1])); - format.negative_format_index = locale_data.unique_strings.ensure(move(negative_format)); + format.negative_format_index = cldr.unique_strings.ensure(move(negative_format)); } else { - format.negative_format_index = locale_data.unique_strings.ensure(String::formatted("{{minusSign}}{}", zero_format)); + format.negative_format_index = cldr.unique_strings.ensure(String::formatted("{{minusSign}}{}", zero_format)); } - format.zero_format_index = locale_data.unique_strings.ensure(move(zero_format)); + format.zero_format_index = cldr.unique_strings.ensure(move(zero_format)); } -static void parse_number_pattern(Vector patterns, UnicodeLocaleData& locale_data, NumberFormatType type, NumberFormatIndexType& format_index, NumberSystem* number_system_for_groupings = nullptr) +static void parse_number_pattern(Vector patterns, CLDR& cldr, NumberFormatType type, NumberFormatIndexType& format_index, NumberSystem* number_system_for_groupings = nullptr) { NumberFormat format {}; - parse_number_pattern(move(patterns), locale_data, type, format, number_system_for_groupings); + parse_number_pattern(move(patterns), cldr, type, format, number_system_for_groupings); - format_index = locale_data.unique_formats.ensure(move(format)); + format_index = cldr.unique_formats.ensure(move(format)); } -static ErrorOr parse_number_systems(String locale_numbers_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_number_systems(String locale_numbers_path, CLDR& cldr, LocaleData& locale) { LexicalPath numbers_path(move(locale_numbers_path)); numbers_path = numbers_path.append("numbers.json"sv); @@ -439,10 +439,10 @@ static ErrorOr parse_number_systems(String locale_numbers_path, UnicodeLoc auto const& minimum_grouping_digits = locale_numbers_object.as_object().get("minimumGroupingDigits"sv); Vector> number_systems; - number_systems.resize(locale_data.number_systems.size()); + number_systems.resize(cldr.number_systems.size()); auto ensure_number_system = [&](auto const& system) -> NumberSystem& { - auto system_index = locale_data.number_systems.find_first_index(system).value(); + auto system_index = cldr.number_systems.find_first_index(system).value(); VERIFY(system_index < number_systems.size()); auto& number_system = number_systems.at(system_index); @@ -479,13 +479,13 @@ static ErrorOr parse_number_systems(String locale_numbers_path, UnicodeLoc } format.plurality = Unicode::plural_category_from_string(split_key[2]); - parse_number_pattern(move(patterns), locale_data, NumberFormatType::Compact, format); + parse_number_pattern(move(patterns), cldr, NumberFormatType::Compact, format); - auto format_index = locale_data.unique_formats.ensure(move(format)); + auto format_index = cldr.unique_formats.ensure(move(format)); result.append(format_index); }); - return locale_data.unique_format_lists.ensure(move(result)); + return cldr.unique_format_lists.ensure(move(result)); }; auto numeric_symbol_from_string = [&](StringView numeric_symbol) -> Optional { @@ -534,7 +534,7 @@ static ErrorOr parse_number_systems(String locale_numbers_path, UnicodeLoc if (to_underlying(*numeric_symbol) >= symbols.size()) symbols.resize(to_underlying(*numeric_symbol) + 1); - auto symbol_index = locale_data.unique_strings.ensure(localization.as_string()); + auto symbol_index = cldr.unique_strings.ensure(localization.as_string()); symbols[to_underlying(*numeric_symbol)] = symbol_index; }); @@ -551,16 +551,16 @@ static ErrorOr parse_number_systems(String locale_numbers_path, UnicodeLoc if (to_underlying(Unicode::NumericSymbol::RangeSeparator) >= symbols.size()) symbols.resize(to_underlying(Unicode::NumericSymbol::RangeSeparator) + 1); - auto symbol_index = locale_data.unique_strings.ensure(move(range_separator)); + auto symbol_index = cldr.unique_strings.ensure(move(range_separator)); symbols[to_underlying(Unicode::NumericSymbol::RangeSeparator)] = symbol_index; - number_system.symbols = locale_data.unique_symbols.ensure(move(symbols)); + number_system.symbols = cldr.unique_symbols.ensure(move(symbols)); } else if (key.starts_with(decimal_formats_prefix)) { auto system = key.substring(decimal_formats_prefix.length()); auto& number_system = ensure_number_system(system); auto format_object = value.as_object().get("standard"sv); - parse_number_pattern(format_object.as_string().split(';'), locale_data, NumberFormatType::Standard, number_system.decimal_format, &number_system); + parse_number_pattern(format_object.as_string().split(';'), cldr, NumberFormatType::Standard, number_system.decimal_format, &number_system); auto const& long_format = value.as_object().get("long"sv).as_object().get("decimalFormat"sv); number_system.decimal_long_formats = parse_number_format(long_format.as_object()); @@ -572,10 +572,10 @@ static ErrorOr parse_number_systems(String locale_numbers_path, UnicodeLoc auto& number_system = ensure_number_system(system); auto format_object = value.as_object().get("standard"sv); - parse_number_pattern(format_object.as_string().split(';'), locale_data, NumberFormatType::Standard, number_system.currency_format); + parse_number_pattern(format_object.as_string().split(';'), cldr, NumberFormatType::Standard, number_system.currency_format); format_object = value.as_object().get("accounting"sv); - parse_number_pattern(format_object.as_string().split(';'), locale_data, NumberFormatType::Standard, number_system.accounting_format); + parse_number_pattern(format_object.as_string().split(';'), cldr, NumberFormatType::Standard, number_system.accounting_format); number_system.currency_unit_formats = parse_number_format(value.as_object()); @@ -588,13 +588,13 @@ static ErrorOr parse_number_systems(String locale_numbers_path, UnicodeLoc auto& number_system = ensure_number_system(system); auto format_object = value.as_object().get("standard"sv); - parse_number_pattern(format_object.as_string().split(';'), locale_data, NumberFormatType::Standard, number_system.percent_format); + parse_number_pattern(format_object.as_string().split(';'), cldr, NumberFormatType::Standard, number_system.percent_format); } else if (key.starts_with(scientific_formats_prefix)) { auto system = key.substring(scientific_formats_prefix.length()); auto& number_system = ensure_number_system(system); auto format_object = value.as_object().get("standard"sv); - parse_number_pattern(format_object.as_string().split(';'), locale_data, NumberFormatType::Standard, number_system.scientific_format); + parse_number_pattern(format_object.as_string().split(';'), cldr, NumberFormatType::Standard, number_system.scientific_format); } }); @@ -603,7 +603,7 @@ static ErrorOr parse_number_systems(String locale_numbers_path, UnicodeLoc for (auto& number_system : number_systems) { NumberSystemIndexType system_index = 0; if (number_system.has_value()) - system_index = locale_data.unique_systems.ensure(number_system.release_value()); + system_index = cldr.unique_systems.ensure(number_system.release_value()); locale.number_systems.append(system_index); } @@ -612,7 +612,7 @@ static ErrorOr parse_number_systems(String locale_numbers_path, UnicodeLoc return {}; } -static ErrorOr parse_units(String locale_units_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_units(String locale_units_path, CLDR& cldr, LocaleData& locale) { LexicalPath units_path(move(locale_units_path)); units_path = units_path.append("units.json"sv); @@ -629,7 +629,7 @@ static ErrorOr parse_units(String locale_units_path, UnicodeLocaleData& lo auto ensure_unit = [&](auto const& unit) -> Unit& { return units.ensure(unit, [&]() { - auto unit_index = locale_data.unique_strings.ensure(unit); + auto unit_index = cldr.unique_strings.ensure(unit); return Unit { .unit = unit_index }; }); }; @@ -679,16 +679,16 @@ static ErrorOr parse_units(String locale_units_path, UnicodeLocaleData& lo format.plurality = Unicode::plural_category_from_string(plurality); auto zero_format = pattern_value.as_string().replace("{0}"sv, "{number}"sv, ReplaceMode::FirstOnly); - zero_format = parse_identifiers(zero_format, "unitIdentifier"sv, locale_data, format); + zero_format = parse_identifiers(zero_format, "unitIdentifier"sv, cldr, format); - format.positive_format_index = locale_data.unique_strings.ensure(zero_format.replace("{number}"sv, "{plusSign}{number}"sv, ReplaceMode::FirstOnly)); - format.negative_format_index = locale_data.unique_strings.ensure(zero_format.replace("{number}"sv, "{minusSign}{number}"sv, ReplaceMode::FirstOnly)); - format.zero_format_index = locale_data.unique_strings.ensure(move(zero_format)); + format.positive_format_index = cldr.unique_strings.ensure(zero_format.replace("{number}"sv, "{plusSign}{number}"sv, ReplaceMode::FirstOnly)); + format.negative_format_index = cldr.unique_strings.ensure(zero_format.replace("{number}"sv, "{minusSign}{number}"sv, ReplaceMode::FirstOnly)); + format.zero_format_index = cldr.unique_strings.ensure(move(zero_format)); - formats.append(locale_data.unique_formats.ensure(move(format))); + formats.append(cldr.unique_formats.ensure(move(format))); }); - auto number_format_list_index = locale_data.unique_format_lists.ensure(move(formats)); + auto number_format_list_index = cldr.unique_format_lists.ensure(move(formats)); switch (style) { case Unicode::Style::Long: @@ -711,14 +711,14 @@ static ErrorOr parse_units(String locale_units_path, UnicodeLocaleData& lo parse_units_object(narrow_object.as_object(), Unicode::Style::Narrow); for (auto& unit : units) { - auto unit_index = locale_data.unique_units.ensure(move(unit.value)); + auto unit_index = cldr.unique_units.ensure(move(unit.value)); locale.units.set(unit.key, unit_index); } return {}; } -static ErrorOr parse_all_locales(String core_path, String numbers_path, String units_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_all_locales(String core_path, String numbers_path, String units_path, CLDR& cldr) { auto numbers_iterator = TRY(path_to_dir_iterator(move(numbers_path))); auto units_iterator = TRY(path_to_dir_iterator(move(units_path))); @@ -727,16 +727,16 @@ static ErrorOr parse_all_locales(String core_path, String numbers_path, St core_supplemental_path = core_supplemental_path.append("supplemental"sv); VERIFY(Core::File::is_directory(core_supplemental_path.string())); - TRY(parse_number_system_digits(core_supplemental_path.string(), locale_data)); + TRY(parse_number_system_digits(core_supplemental_path.string(), cldr)); auto remove_variants_from_path = [&](String path) -> ErrorOr { - auto parsed_locale = TRY(CanonicalLanguageID::parse(locale_data.unique_strings, LexicalPath::basename(path))); + auto parsed_locale = TRY(CanonicalLanguageID::parse(cldr.unique_strings, LexicalPath::basename(path))); StringBuilder builder; - builder.append(locale_data.unique_strings.get(parsed_locale.language)); - if (auto script = locale_data.unique_strings.get(parsed_locale.script); !script.is_empty()) + builder.append(cldr.unique_strings.get(parsed_locale.language)); + if (auto script = cldr.unique_strings.get(parsed_locale.script); !script.is_empty()) builder.appendff("-{}", script); - if (auto region = locale_data.unique_strings.get(parsed_locale.region); !region.is_empty()) + if (auto region = cldr.unique_strings.get(parsed_locale.region); !region.is_empty()) builder.appendff("-{}", region); return builder.build(); @@ -746,16 +746,16 @@ static ErrorOr parse_all_locales(String core_path, String numbers_path, St auto numbers_path = TRY(next_path_from_dir_iterator(numbers_iterator)); auto language = TRY(remove_variants_from_path(numbers_path)); - auto& locale = locale_data.locales.ensure(language); - TRY(parse_number_systems(numbers_path, locale_data, locale)); + auto& locale = cldr.locales.ensure(language); + TRY(parse_number_systems(numbers_path, cldr, locale)); } while (units_iterator.has_next()) { auto units_path = TRY(next_path_from_dir_iterator(units_iterator)); auto language = TRY(remove_variants_from_path(units_path)); - auto& locale = locale_data.locales.ensure(language); - TRY(parse_units(units_path, locale_data, locale)); + auto& locale = cldr.locales.ensure(language); + TRY(parse_units(units_path, cldr, locale)); } return {}; @@ -766,7 +766,7 @@ static String format_identifier(StringView, String identifier) return identifier.to_titlecase(); } -static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, UnicodeLocaleData& locale_data) +static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, CLDR& cldr) { StringBuilder builder; SourceGenerator generator { builder }; @@ -779,7 +779,7 @@ static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& namespace Unicode { )~~~"); - generate_enum(generator, format_identifier, "NumberSystem"sv, {}, locale_data.number_systems); + generate_enum(generator, format_identifier, "NumberSystem"sv, {}, cldr.number_systems); generator.append(R"~~~( } @@ -789,7 +789,7 @@ namespace Unicode { return {}; } -static ErrorOr generate_unicode_locale_implementation(Core::Stream::BufferedFile& file, UnicodeLocaleData& locale_data) +static ErrorOr generate_unicode_locale_implementation(Core::Stream::BufferedFile& file, CLDR& cldr) { StringBuilder builder; SourceGenerator generator { builder }; @@ -797,7 +797,7 @@ static ErrorOr generate_unicode_locale_implementation(Core::Stream::Buffer generator.set("number_format_index_type"sv, s_number_format_index_type); generator.set("number_format_list_index_type"sv, s_number_format_list_index_type); generator.set("numeric_symbol_list_index_type"sv, s_numeric_symbol_list_index_type); - generator.set("identifier_count", String::number(locale_data.max_identifier_count)); + generator.set("identifier_count", String::number(cldr.max_identifier_count)); generator.append(R"~~~( #include @@ -815,7 +815,7 @@ static ErrorOr generate_unicode_locale_implementation(Core::Stream::Buffer namespace Unicode { )~~~"); - locale_data.unique_strings.generate(generator); + cldr.unique_strings.generate(generator); generator.append(R"~~~( struct NumberFormatImpl { @@ -872,13 +872,13 @@ struct Unit { }; )~~~"); - locale_data.unique_formats.generate(generator, "NumberFormatImpl"sv, "s_number_formats"sv, 10); - locale_data.unique_format_lists.generate(generator, s_number_format_index_type, "s_number_format_lists"sv); - locale_data.unique_symbols.generate(generator, s_string_index_type, "s_numeric_symbol_lists"sv); - locale_data.unique_systems.generate(generator, "NumberSystemData"sv, "s_number_systems"sv, 10); - locale_data.unique_units.generate(generator, "Unit"sv, "s_units"sv, 10); + cldr.unique_formats.generate(generator, "NumberFormatImpl"sv, "s_number_formats"sv, 10); + cldr.unique_format_lists.generate(generator, s_number_format_index_type, "s_number_format_lists"sv); + cldr.unique_symbols.generate(generator, s_string_index_type, "s_numeric_symbol_lists"sv); + cldr.unique_systems.generate(generator, "NumberSystemData"sv, "s_number_systems"sv, 10); + cldr.unique_units.generate(generator, "Unit"sv, "s_units"sv, 10); - auto locales = locale_data.locales.keys(); + auto locales = cldr.locales.keys(); quick_sort(locales); generator.set("size", String::number(locales.size())); @@ -888,7 +888,7 @@ static constexpr Array s_minimum_grouping_digits { { )~~~"); bool first = true; for (auto const& locale : locales) { generator.append(first ? " "sv : ", "sv); - generator.append(String::number(locale_data.locales.find(locale)->value.minimum_grouping_digits)); + generator.append(String::number(cldr.locales.find(locale)->value.minimum_grouping_digits)); first = false; } generator.append(" } };\n"); @@ -914,16 +914,16 @@ static constexpr Array<@type@, @size@> @name@ { {)~~~"); generator.append(" } };"); }; - generate_mapping(generator, locale_data.number_system_digits, "u32"sv, "s_number_systems_digits"sv, "s_number_systems_digits_{}"sv, nullptr, [&](auto const& name, auto const& value) { append_map(name, "u32"sv, value); }); - generate_mapping(generator, locale_data.locales, s_number_system_index_type, "s_locale_number_systems"sv, "s_number_systems_{}"sv, nullptr, [&](auto const& name, auto const& value) { append_map(name, s_number_system_index_type, value.number_systems); }); - generate_mapping(generator, locale_data.locales, s_unit_index_type, "s_locale_units"sv, "s_units_{}"sv, nullptr, [&](auto const& name, auto const& value) { append_map(name, s_unit_index_type, value.units); }); + generate_mapping(generator, cldr.number_system_digits, "u32"sv, "s_number_systems_digits"sv, "s_number_systems_digits_{}"sv, nullptr, [&](auto const& name, auto const& value) { append_map(name, "u32"sv, value); }); + generate_mapping(generator, cldr.locales, s_number_system_index_type, "s_locale_number_systems"sv, "s_number_systems_{}"sv, nullptr, [&](auto const& name, auto const& value) { append_map(name, s_number_system_index_type, value.number_systems); }); + generate_mapping(generator, cldr.locales, s_unit_index_type, "s_locale_units"sv, "s_units_{}"sv, nullptr, [&](auto const& name, auto const& value) { append_map(name, s_unit_index_type, value.units); }); generator.append(R"~~~( static Optional keyword_to_number_system(KeywordNumbers keyword) { switch (keyword) {)~~~"); - for (auto const& number_system : locale_data.number_systems) { + for (auto const& number_system : cldr.number_systems) { generator.set("name"sv, format_identifier({}, number_system)); generator.append(R"~~~( case KeywordNumbers::@name@: @@ -1152,11 +1152,11 @@ ErrorOr serenity_main(Main::Arguments arguments) auto generated_header_file = TRY(open_file(generated_header_path, Core::Stream::OpenMode::Write)); auto generated_implementation_file = TRY(open_file(generated_implementation_path, Core::Stream::OpenMode::Write)); - UnicodeLocaleData locale_data; - TRY(parse_all_locales(core_path, numbers_path, units_path, locale_data)); + CLDR cldr; + TRY(parse_all_locales(core_path, numbers_path, units_path, cldr)); - TRY(generate_unicode_locale_header(*generated_header_file, locale_data)); - TRY(generate_unicode_locale_implementation(*generated_implementation_file, locale_data)); + TRY(generate_unicode_locale_header(*generated_header_file, cldr)); + TRY(generate_unicode_locale_implementation(*generated_implementation_file, cldr)); return 0; } diff --git a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GeneratePluralRulesData.cpp b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GeneratePluralRulesData.cpp index 91bc18894b..5d823b2a7d 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GeneratePluralRulesData.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GeneratePluralRulesData.cpp @@ -193,7 +193,7 @@ struct Range { using Conditions = HashMap; using Ranges = Vector; -struct Locale { +struct LocaleData { static String generated_method_name(StringView form, StringView locale) { return String::formatted("{}_plurality_{}", form, format_identifier({}, locale)); @@ -213,10 +213,10 @@ struct Locale { Ranges plural_ranges; }; -struct UnicodeLocaleData { +struct CLDR { UniqueStringStorage unique_strings; - HashMap locales; + HashMap locales; }; static Relation parse_relation(StringView relation) @@ -324,7 +324,7 @@ static void parse_condition(StringView category, StringView rule, Conditions& ru }); } -static ErrorOr parse_plural_rules(String core_supplemental_path, StringView file_name, UnicodeLocaleData& locale_data) +static ErrorOr parse_plural_rules(String core_supplemental_path, StringView file_name, CLDR& cldr) { static constexpr auto form_prefix = "plurals-type-"sv; static constexpr auto rule_prefix = "pluralRule-count-"sv; @@ -342,7 +342,7 @@ static ErrorOr parse_plural_rules(String core_supplemental_path, StringVie auto form = key.substring_view(form_prefix.length()); plurals_object.as_object().for_each_member([&](auto const& loc, auto const& rules) { - auto locale = locale_data.locales.get(loc); + auto locale = cldr.locales.get(loc); if (!locale.has_value()) return; @@ -359,7 +359,7 @@ static ErrorOr parse_plural_rules(String core_supplemental_path, StringVie } // https://unicode.org/reports/tr35/tr35-numbers.html#Plural_Ranges -static ErrorOr parse_plural_ranges(String core_supplemental_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_plural_ranges(String core_supplemental_path, CLDR& cldr) { static constexpr auto start_segment = "-start-"sv; static constexpr auto end_segment = "-end-"sv; @@ -372,7 +372,7 @@ static ErrorOr parse_plural_ranges(String core_supplemental_path, UnicodeL auto const& plurals_object = supplemental_object.as_object().get("plurals"sv); plurals_object.as_object().for_each_member([&](auto const& loc, auto const& ranges_object) { - auto locale = locale_data.locales.get(loc); + auto locale = cldr.locales.get(loc); if (!locale.has_value()) return; @@ -395,7 +395,7 @@ static ErrorOr parse_plural_ranges(String core_supplemental_path, UnicodeL return {}; } -static ErrorOr parse_all_locales(String core_path, String locale_names_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_all_locales(String core_path, String locale_names_path, CLDR& cldr) { auto identity_iterator = TRY(path_to_dir_iterator(move(locale_names_path))); @@ -404,13 +404,13 @@ static ErrorOr parse_all_locales(String core_path, String locale_names_pat VERIFY(Core::File::is_directory(core_supplemental_path.string())); auto remove_variants_from_path = [&](String path) -> ErrorOr { - auto parsed_locale = TRY(CanonicalLanguageID::parse(locale_data.unique_strings, LexicalPath::basename(path))); + auto parsed_locale = TRY(CanonicalLanguageID::parse(cldr.unique_strings, LexicalPath::basename(path))); StringBuilder builder; - builder.append(locale_data.unique_strings.get(parsed_locale.language)); - if (auto script = locale_data.unique_strings.get(parsed_locale.script); !script.is_empty()) + builder.append(cldr.unique_strings.get(parsed_locale.language)); + if (auto script = cldr.unique_strings.get(parsed_locale.script); !script.is_empty()) builder.appendff("-{}", script); - if (auto region = locale_data.unique_strings.get(parsed_locale.region); !region.is_empty()) + if (auto region = cldr.unique_strings.get(parsed_locale.region); !region.is_empty()) builder.appendff("-{}", region); return builder.build(); @@ -420,16 +420,16 @@ static ErrorOr parse_all_locales(String core_path, String locale_names_pat auto locale_path = TRY(next_path_from_dir_iterator(identity_iterator)); auto language = TRY(remove_variants_from_path(locale_path)); - locale_data.locales.ensure(language); + cldr.locales.ensure(language); } - TRY(parse_plural_rules(core_supplemental_path.string(), "plurals.json"sv, locale_data)); - TRY(parse_plural_rules(core_supplemental_path.string(), "ordinals.json"sv, locale_data)); - TRY(parse_plural_ranges(core_supplemental_path.string(), locale_data)); + TRY(parse_plural_rules(core_supplemental_path.string(), "plurals.json"sv, cldr)); + TRY(parse_plural_rules(core_supplemental_path.string(), "ordinals.json"sv, cldr)); + TRY(parse_plural_ranges(core_supplemental_path.string(), cldr)); return {}; } -static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, UnicodeLocaleData&) +static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, CLDR&) { StringBuilder builder; SourceGenerator generator { builder }; @@ -450,12 +450,12 @@ namespace Unicode { return {}; } -static ErrorOr generate_unicode_locale_implementation(Core::Stream::BufferedFile& file, UnicodeLocaleData& locale_data) +static ErrorOr generate_unicode_locale_implementation(Core::Stream::BufferedFile& file, CLDR& cldr) { StringBuilder builder; SourceGenerator generator { builder }; - auto locales = locale_data.locales.keys(); + auto locales = cldr.locales.keys(); quick_sort(locales); generator.append(R"~~~( @@ -487,7 +487,7 @@ static PluralCategory default_range(PluralCategory, PluralCategory end) if (rules.is_empty()) return; - generator.set("method"sv, Locale::generated_method_name(form, locale)); + generator.set("method"sv, LocaleData::generated_method_name(form, locale)); HashTable generated_variables; generator.append(R"~~~( @@ -517,7 +517,7 @@ static PluralCategory @method@([[maybe_unused]] PluralOperands ops) if (ranges.is_empty()) return; - generator.set("method"sv, Locale::generated_method_name("range"sv, locale)); + generator.set("method"sv, LocaleData::generated_method_name("range"sv, locale)); generator.append(R"~~~( static PluralCategory @method@(PluralCategory start, PluralCategory end) @@ -549,13 +549,13 @@ static PluralCategory @method@(PluralCategory start, PluralCategory end) static constexpr Array<@type@, @size@> s_@form@_functions { {)~~~"); for (auto const& locale : locales) { - auto& rules = data_for_locale(locale_data.locales.find(locale)->value, form); + auto& rules = data_for_locale(cldr.locales.find(locale)->value, form); if (rules.is_empty()) { generator.append(R"~~~( @default@,)~~~"); } else { - generator.set("method"sv, Locale::generated_method_name(form, locale)); + generator.set("method"sv, LocaleData::generated_method_name(form, locale)); generator.append(R"~~~( @method@,)~~~"); } @@ -581,7 +581,7 @@ static constexpr Array @name@ { { PluralCategory::Other) generator.append("} };"); }; - for (auto [locale, rules] : locale_data.locales) { + for (auto [locale, rules] : cldr.locales) { append_rules("cardinal"sv, locale, rules.cardinal_rules); append_rules("ordinal"sv, locale, rules.ordinal_rules); append_ranges(locale, rules.plural_ranges); @@ -593,13 +593,13 @@ static constexpr Array @name@ { { PluralCategory::Other) generate_mapping(generator, locales, "PluralCategory"sv, "s_cardinal_categories"sv, "s_cardinal_categories_{}"sv, format_identifier, [&](auto const& name, auto const& locale) { - auto& rules = locale_data.locales.find(locale)->value; + auto& rules = cldr.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_{}"sv, format_identifier, [&](auto const& name, auto const& locale) { - auto& rules = locale_data.locales.find(locale)->value; + auto& rules = cldr.locales.find(locale)->value; append_categories(name, rules.rules_for_form("ordinal"sv)); }); @@ -679,11 +679,11 @@ ErrorOr serenity_main(Main::Arguments arguments) auto generated_header_file = TRY(open_file(generated_header_path, Core::Stream::OpenMode::Write)); auto generated_implementation_file = TRY(open_file(generated_implementation_path, Core::Stream::OpenMode::Write)); - UnicodeLocaleData locale_data; - TRY(parse_all_locales(core_path, locale_names_path, locale_data)); + CLDR cldr; + TRY(parse_all_locales(core_path, locale_names_path, cldr)); - TRY(generate_unicode_locale_header(*generated_header_file, locale_data)); - TRY(generate_unicode_locale_implementation(*generated_implementation_file, locale_data)); + TRY(generate_unicode_locale_header(*generated_header_file, cldr)); + TRY(generate_unicode_locale_implementation(*generated_implementation_file, cldr)); return 0; } diff --git a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateRelativeTimeFormatData.cpp b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateRelativeTimeFormatData.cpp index 8bd858d20c..80fda310ce 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateRelativeTimeFormatData.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateRelativeTimeFormatData.cpp @@ -72,18 +72,18 @@ struct AK::Traits : public GenericTraits static unsigned hash(RelativeTimeFormat const& format) { return format.hash(); } }; -struct Locale { +struct LocaleData { Vector time_units; }; -struct UnicodeLocaleData { +struct CLDR { UniqueStringStorage unique_strings; UniqueStorage unique_formats; - HashMap locales; + HashMap locales; }; -static ErrorOr parse_date_fields(String locale_dates_path, UnicodeLocaleData& locale_data, Locale& locale) +static ErrorOr parse_date_fields(String locale_dates_path, CLDR& cldr, LocaleData& locale) { LexicalPath date_fields_path(move(locale_dates_path)); date_fields_path = date_fields_path.append("dateFields.json"sv); @@ -105,10 +105,10 @@ static ErrorOr parse_date_fields(String locale_dates_path, UnicodeLocaleDa format.time_unit = unit.to_titlecase_string(); format.style = style.to_titlecase_string(); format.plurality = plurality.to_titlecase_string(); - format.tense_or_number = locale_data.unique_strings.ensure(tense_or_number); - format.pattern = locale_data.unique_strings.ensure(pattern.as_string()); + format.tense_or_number = cldr.unique_strings.ensure(tense_or_number); + format.pattern = cldr.unique_strings.ensure(pattern.as_string()); - locale.time_units.append(locale_data.unique_formats.ensure(move(format))); + locale.time_units.append(cldr.unique_formats.ensure(move(format))); }; fields_object.as_object().for_each_member([&](auto const& unit_and_style, auto const& patterns) { @@ -142,18 +142,18 @@ static ErrorOr parse_date_fields(String locale_dates_path, UnicodeLocaleDa return {}; } -static ErrorOr parse_all_locales(String dates_path, UnicodeLocaleData& locale_data) +static ErrorOr parse_all_locales(String dates_path, CLDR& cldr) { auto dates_iterator = TRY(path_to_dir_iterator(move(dates_path))); auto remove_variants_from_path = [&](String path) -> ErrorOr { - auto parsed_locale = TRY(CanonicalLanguageID::parse(locale_data.unique_strings, LexicalPath::basename(path))); + auto parsed_locale = TRY(CanonicalLanguageID::parse(cldr.unique_strings, LexicalPath::basename(path))); StringBuilder builder; - builder.append(locale_data.unique_strings.get(parsed_locale.language)); - if (auto script = locale_data.unique_strings.get(parsed_locale.script); !script.is_empty()) + builder.append(cldr.unique_strings.get(parsed_locale.language)); + if (auto script = cldr.unique_strings.get(parsed_locale.script); !script.is_empty()) builder.appendff("-{}", script); - if (auto region = locale_data.unique_strings.get(parsed_locale.region); !region.is_empty()) + if (auto region = cldr.unique_strings.get(parsed_locale.region); !region.is_empty()) builder.appendff("-{}", region); return builder.build(); @@ -163,14 +163,14 @@ static ErrorOr parse_all_locales(String dates_path, UnicodeLocaleData& loc auto dates_path = TRY(next_path_from_dir_iterator(dates_iterator)); auto language = TRY(remove_variants_from_path(dates_path)); - auto& locale = locale_data.locales.ensure(language); - TRY(parse_date_fields(move(dates_path), locale_data, locale)); + auto& locale = cldr.locales.ensure(language); + TRY(parse_date_fields(move(dates_path), cldr, locale)); } return {}; } -static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, UnicodeLocaleData&) +static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, CLDR&) { StringBuilder builder; SourceGenerator generator { builder }; @@ -191,7 +191,7 @@ namespace Unicode { return {}; } -static ErrorOr generate_unicode_locale_implementation(Core::Stream::BufferedFile& file, UnicodeLocaleData& locale_data) +static ErrorOr generate_unicode_locale_implementation(Core::Stream::BufferedFile& file, CLDR& cldr) { StringBuilder builder; SourceGenerator generator { builder }; @@ -210,7 +210,7 @@ static ErrorOr generate_unicode_locale_implementation(Core::Stream::Buffer namespace Unicode { )~~~"); - locale_data.unique_strings.generate(generator); + cldr.unique_strings.generate(generator); generator.append(R"~~~( struct RelativeTimeFormatImpl { @@ -231,7 +231,7 @@ struct RelativeTimeFormatImpl { }; )~~~"); - locale_data.unique_formats.generate(generator, "RelativeTimeFormatImpl"sv, "s_relative_time_formats"sv, 10); + cldr.unique_formats.generate(generator, "RelativeTimeFormatImpl"sv, "s_relative_time_formats"sv, 10); auto append_list = [&](String name, auto const& list) { generator.set("name", name); @@ -250,7 +250,7 @@ static constexpr Array<@relative_time_format_index_type@, @size@> @name@ { {)~~~ generator.append(" } };"); }; - generate_mapping(generator, locale_data.locales, s_relative_time_format_index_type, "s_locale_relative_time_formats"sv, "s_number_systems_digits_{}"sv, nullptr, [&](auto const& name, auto const& value) { append_list(name, value.time_units); }); + generate_mapping(generator, cldr.locales, s_relative_time_format_index_type, "s_locale_relative_time_formats"sv, "s_number_systems_digits_{}"sv, nullptr, [&](auto const& name, auto const& value) { append_list(name, value.time_units); }); generator.append(R"~~~( Vector get_relative_time_format_patterns(StringView locale, TimeUnit time_unit, StringView tense_or_number, Style style) @@ -302,11 +302,11 @@ ErrorOr serenity_main(Main::Arguments arguments) auto generated_header_file = TRY(open_file(generated_header_path, Core::Stream::OpenMode::Write)); auto generated_implementation_file = TRY(open_file(generated_implementation_path, Core::Stream::OpenMode::Write)); - UnicodeLocaleData locale_data; - TRY(parse_all_locales(dates_path, locale_data)); + CLDR cldr; + TRY(parse_all_locales(dates_path, cldr)); - TRY(generate_unicode_locale_header(*generated_header_file, locale_data)); - TRY(generate_unicode_locale_implementation(*generated_implementation_file, locale_data)); + TRY(generate_unicode_locale_header(*generated_header_file, cldr)); + TRY(generate_unicode_locale_implementation(*generated_implementation_file, cldr)); return 0; }