diff --git a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp index ec6fa40df57..47eed1bd961 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 8f3a12aca5e..87024611ab8 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 d757295f7de..650daf075c5 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 91bc18894b7..5d823b2a7d0 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 8bd858d20cd..80fda310ce5 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; }