diff --git a/Meta/Lagom/CMakeLists.txt b/Meta/Lagom/CMakeLists.txt index b8ef9cc400..a4aa83d1b5 100644 --- a/Meta/Lagom/CMakeLists.txt +++ b/Meta/Lagom/CMakeLists.txt @@ -449,6 +449,7 @@ if (BUILD_LAGOM) SOURCES ${LIBUNICODE_SOURCES} ${UNICODE_DATA_SOURCES} ) target_compile_definitions(LagomUnicode PRIVATE ENABLE_UNICODE_DATA=$) + target_link_libraries(LagomUnicode LagomTimeZone) # WASM file(GLOB LIBWASM_SOURCES CONFIGURE_DEPENDS "../../Userland/Libraries/LibWasm/*/*.cpp") diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/CMakeLists.txt b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/CMakeLists.txt index ca6301ea11..d71891a277 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/CMakeLists.txt +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/CMakeLists.txt @@ -1,4 +1,4 @@ lagom_tool(GenerateUnicodeData SOURCES GenerateUnicodeData.cpp LIBS LagomMain) -lagom_tool(GenerateUnicodeDateTimeFormat SOURCES GenerateUnicodeDateTimeFormat.cpp LIBS LagomMain) +lagom_tool(GenerateUnicodeDateTimeFormat SOURCES GenerateUnicodeDateTimeFormat.cpp LIBS LagomMain LagomTimeZone) lagom_tool(GenerateUnicodeLocale SOURCES GenerateUnicodeLocale.cpp LIBS LagomMain) lagom_tool(GenerateUnicodeNumberFormat SOURCES GenerateUnicodeNumberFormat.cpp LIBS LagomMain) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp index 9c98d2e6d5..f203d411f3 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include using StringIndexType = u16; @@ -519,7 +520,7 @@ struct UnicodeLocaleData { HashMap hour_cycles; Vector hour_cycle_regions; - HashMap> meta_zones; + HashMap> meta_zones; Vector time_zones { "UTC"sv }; Vector calendars; @@ -618,12 +619,15 @@ static ErrorOr parse_meta_zones(String core_path, UnicodeLocaleData& local auto const& meta_zone = mapping.as_object().get("_other"sv); auto const& golden_zone = mapping.as_object().get("_type"sv); - auto& golden_zones = locale_data.meta_zones.ensure(meta_zone.as_string()); - golden_zones.append(golden_zone.as_string()); + 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()); + 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. - locale_data.meta_zones.set("UTC"sv, { "UTC"sv }); + if (auto time_zone = TimeZone::time_zone_from_string("UTC"sv); time_zone.has_value()) + locale_data.meta_zones.set("UTC"sv, { *time_zone }); return {}; }; @@ -1403,7 +1407,10 @@ static ErrorOr parse_time_zone_names(String locale_time_zone_names_path, U time_zone_formats.gmt_zero_format = locale_data.unique_strings.ensure(gmt_zero_format_string.as_string()); auto parse_time_zone = [&](StringView meta_zone, JsonObject const& meta_zone_object) { - auto const& golden_zones = locale_data.meta_zones.find(meta_zone)->value; + auto golden_zones = locale_data.meta_zones.find(meta_zone); + if (golden_zones == locale_data.meta_zones.end()) + return; + TimeZoneNames time_zone_names {}; if (auto long_name = parse_name("long"sv, meta_zone_object); long_name.has_value()) @@ -1411,24 +1418,17 @@ static ErrorOr parse_time_zone_names(String locale_time_zone_names_path, U if (auto short_name = parse_name("short"sv, meta_zone_object); short_name.has_value()) time_zone_names.short_name = short_name.value(); - for (auto const& golden_zone : golden_zones) { - auto time_zone_index = locale_data.time_zones.find_first_index(golden_zone).value(); - time_zones[time_zone_index] = locale_data.unique_time_zones.ensure(move(time_zone_names)); + auto time_zone_index = locale_data.unique_time_zones.ensure(move(time_zone_names)); + + for (auto golden_zone : golden_zones->value) { + auto time_zone = to_underlying(golden_zone); + if (time_zone >= time_zones.size()) + time_zones.resize(time_zone + 1); + + time_zones[time_zone] = time_zone_index; } }; - meta_zone_object.as_object().for_each_member([&](auto const& meta_zone, JsonValue const&) { - auto const& golden_zones = locale_data.meta_zones.find(meta_zone)->value; - - for (auto const& golden_zone : golden_zones) { - if (!locale_data.time_zones.contains_slow(golden_zone)) - locale_data.time_zones.append(golden_zone); - } - }); - - time_zones.resize(locale_data.time_zones.size()); - quick_sort(locale_data.time_zones); - meta_zone_object.as_object().for_each_member([&](auto const& meta_zone, JsonValue const& value) { parse_time_zone(meta_zone, value.as_object()); }); @@ -1566,7 +1566,6 @@ namespace Unicode { generate_enum(generator, format_identifier, "Calendar"sv, {}, locale_data.calendars, locale_data.calendar_aliases); generate_enum(generator, format_identifier, "HourCycleRegion"sv, {}, locale_data.hour_cycle_regions); - generate_enum(generator, format_identifier, "TimeZone"sv, {}, locale_data.time_zones); generator.append(R"~~~( } @@ -1599,6 +1598,7 @@ static void generate_unicode_locale_implementation(Core::File& file, UnicodeLoca #include #include #include +#include #include #include #include @@ -1835,7 +1835,6 @@ static constexpr Array<@type@, @size@> @name@ { {)~~~"); append_from_string("Calendar"sv, "calendar"sv, locale_data.calendars, locale_data.calendar_aliases); append_from_string("HourCycleRegion"sv, "hour_cycle_region"sv, locale_data.hour_cycle_regions); - append_from_string("TimeZone"sv, "time_zone"sv, locale_data.time_zones); generator.append(R"~~~( Vector get_regional_hour_cycles(StringView region) @@ -2087,7 +2086,7 @@ static TimeZoneNames const* find_time_zone_names(StringView locale, StringView t if (!locale_value.has_value()) return nullptr; - auto time_zone_value = time_zone_from_string(time_zone); + auto time_zone_value = ::TimeZone::time_zone_from_string(time_zone); if (!time_zone_value.has_value()) return nullptr; @@ -2096,6 +2095,8 @@ static TimeZoneNames const* find_time_zone_names(StringView locale, StringView t auto time_zone_list_index = s_locale_time_zones.at(locale_index); auto const& time_zone_list = s_time_zone_lists.at(time_zone_list_index); + if (time_zone_list.size() <= time_zone_index) + return nullptr; time_zone_index = time_zone_list.at(time_zone_index); return &s_time_zones[time_zone_index]; diff --git a/Userland/Libraries/LibUnicode/CMakeLists.txt b/Userland/Libraries/LibUnicode/CMakeLists.txt index 6752fbb09d..c59470cca0 100644 --- a/Userland/Libraries/LibUnicode/CMakeLists.txt +++ b/Userland/Libraries/LibUnicode/CMakeLists.txt @@ -4,7 +4,7 @@ if (DEFINED UNICODE_DATA_SOURCES) set(SOURCES ${UNICODE_DATA_SOURCES}) serenity_lib(LibUnicodeData unicodedata) target_compile_options(LibUnicodeData PRIVATE -g0 -Os) - target_link_libraries(LibUnicodeData LibCore) + target_link_libraries(LibUnicodeData LibCore LibTimeZone) endif() set(SOURCES diff --git a/Userland/Libraries/LibUnicode/DateTimeFormat.cpp b/Userland/Libraries/LibUnicode/DateTimeFormat.cpp index c6542430a1..c3afa8cdf1 100644 --- a/Userland/Libraries/LibUnicode/DateTimeFormat.cpp +++ b/Userland/Libraries/LibUnicode/DateTimeFormat.cpp @@ -91,7 +91,6 @@ StringView calendar_pattern_style_to_string(CalendarPatternStyle style) Optional __attribute__((weak)) calendar_from_string(StringView) { return {}; } Optional __attribute__((weak)) hour_cycle_region_from_string(StringView) { return {}; } -Optional __attribute__((weak)) time_zone_from_string(StringView) { return {}; } Vector __attribute__((weak)) get_regional_hour_cycles(StringView) { return {}; } // https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table diff --git a/Userland/Libraries/LibUnicode/DateTimeFormat.h b/Userland/Libraries/LibUnicode/DateTimeFormat.h index 1a909ca671..085eef78aa 100644 --- a/Userland/Libraries/LibUnicode/DateTimeFormat.h +++ b/Userland/Libraries/LibUnicode/DateTimeFormat.h @@ -174,7 +174,6 @@ StringView calendar_pattern_style_to_string(CalendarPatternStyle style); Optional calendar_from_string(StringView calendar); Optional hour_cycle_region_from_string(StringView hour_cycle_region); -Optional time_zone_from_string(StringView time_zone); Vector get_regional_hour_cycles(StringView region); Vector get_locale_hour_cycles(StringView locale); diff --git a/Userland/Libraries/LibUnicode/Forward.h b/Userland/Libraries/LibUnicode/Forward.h index dc093bcd2c..9899ec9142 100644 --- a/Userland/Libraries/LibUnicode/Forward.h +++ b/Userland/Libraries/LibUnicode/Forward.h @@ -35,7 +35,6 @@ enum class ScriptTag : u8; enum class StandardNumberFormatType : u8; enum class Style : u8; enum class Territory : u8; -enum class TimeZone : u16; enum class Weekday : u8; enum class WordBreakProperty : u8;