From ebd33e580b1b734197f678071545b66883302808 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sun, 30 Jan 2022 16:45:35 -0500 Subject: [PATCH] LibUnicode: Generate a list of available calendars --- .../GenerateUnicodeDateTimeFormat.cpp | 2 ++ .../CodeGenerators/LibUnicode/GeneratorUtil.h | 28 +++++++++++++++++++ .../Libraries/LibUnicode/DateTimeFormat.cpp | 1 + .../Libraries/LibUnicode/DateTimeFormat.h | 2 ++ 4 files changed, 33 insertions(+) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp index 6afd2df3b8..a6da368542 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp @@ -1863,6 +1863,8 @@ struct DayPeriodData { }; )~~~"); + generate_available_values(generator, "get_available_calendars"sv, locale_data.calendars, locale_data.calendar_aliases); + 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); diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h index 669ace5c79..d9c817f6e4 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h @@ -488,3 +488,31 @@ static constexpr Array, @size@> @name@ { { } }; )~~~"); } + +template +void generate_available_values(SourceGenerator& generator, StringView name, Vector const& values, Vector const& aliases = {}) +{ + generator.set("name", name); + generator.set("size", String::number(values.size())); + + generator.append(R"~~~( +Span @name@() +{ + static constexpr Array values { {)~~~"); + + bool first = true; + for (auto const& value : values) { + generator.append(first ? " " : ", "); + first = false; + + if (auto it = aliases.find_if([&](auto const& alias) { return alias.name == value; }); it != aliases.end()) + generator.append(String::formatted("\"{}\"sv", it->alias)); + else + generator.append(String::formatted("\"{}\"sv", value)); + } + + generator.append(R"~~~( } }; + return values.span(); +} +)~~~"); +} diff --git a/Userland/Libraries/LibUnicode/DateTimeFormat.cpp b/Userland/Libraries/LibUnicode/DateTimeFormat.cpp index 8bfc53da65..e08cfdf48f 100644 --- a/Userland/Libraries/LibUnicode/DateTimeFormat.cpp +++ b/Userland/Libraries/LibUnicode/DateTimeFormat.cpp @@ -93,6 +93,7 @@ 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 {}; } +Span __attribute__((weak)) get_available_calendars() { 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 5adb2ecec7..0ae006fa0b 100644 --- a/Userland/Libraries/LibUnicode/DateTimeFormat.h +++ b/Userland/Libraries/LibUnicode/DateTimeFormat.h @@ -189,6 +189,8 @@ StringView calendar_pattern_style_to_string(CalendarPatternStyle style); Optional calendar_from_string(StringView calendar); Optional hour_cycle_region_from_string(StringView hour_cycle_region); +Span get_available_calendars(); + Vector get_regional_hour_cycles(StringView region); Vector get_locale_hour_cycles(StringView locale); Optional get_default_regional_hour_cycle(StringView locale);