mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 08:24:58 +00:00
LibTimeZone+Userland: Include Link entries when returning all time zones
We currently only return primary time zones, i.e. time zones that are not a Link. LibJS will require knowledge of Link entries, and whether each entry is or is not a Link.
This commit is contained in:
parent
ddaba88340
commit
0bc401a1d6
6 changed files with 63 additions and 9 deletions
|
@ -67,6 +67,8 @@ struct TimeZoneData {
|
||||||
|
|
||||||
HashMap<DeprecatedString, Vector<size_t>> time_zone_regions;
|
HashMap<DeprecatedString, Vector<size_t>> time_zone_regions;
|
||||||
Vector<DeprecatedString> time_zone_region_names;
|
Vector<DeprecatedString> time_zone_region_names;
|
||||||
|
|
||||||
|
Vector<TimeZone::TimeZoneIdentifier> time_zones_and_links;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -127,6 +129,17 @@ struct AK::Formatter<DaylightSavingsOffset> : Formatter<FormatString> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct AK::Formatter<TimeZone::TimeZoneIdentifier> : Formatter<FormatString> {
|
||||||
|
ErrorOr<void> format(FormatBuilder& builder, TimeZone::TimeZoneIdentifier const& time_zone)
|
||||||
|
{
|
||||||
|
return Formatter<FormatString>::format(builder,
|
||||||
|
"{{ \"{}\"sv, IsLink::{} }}"sv,
|
||||||
|
time_zone.name,
|
||||||
|
time_zone.is_link == TimeZone::IsLink::Yes ? "Yes"sv : "No"sv);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
struct AK::Formatter<TimeZone::Coordinate> : Formatter<FormatString> {
|
struct AK::Formatter<TimeZone::Coordinate> : Formatter<FormatString> {
|
||||||
ErrorOr<void> format(FormatBuilder& builder, TimeZone::Coordinate const& coordinate)
|
ErrorOr<void> format(FormatBuilder& builder, TimeZone::Coordinate const& coordinate)
|
||||||
|
@ -249,8 +262,10 @@ static Vector<TimeZoneOffset>& parse_zone(StringView zone_line, TimeZoneData& ti
|
||||||
auto& time_zones = time_zone_data.time_zones.ensure(name);
|
auto& time_zones = time_zone_data.time_zones.ensure(name);
|
||||||
time_zones.append(move(time_zone));
|
time_zones.append(move(time_zone));
|
||||||
|
|
||||||
if (!time_zone_data.time_zone_names.contains_slow(name))
|
if (!time_zone_data.time_zone_names.contains_slow(name)) {
|
||||||
time_zone_data.time_zone_names.append(name);
|
time_zone_data.time_zone_names.append(name);
|
||||||
|
time_zone_data.time_zones_and_links.append({ time_zone_data.time_zone_names.last(), TimeZone::IsLink::No });
|
||||||
|
}
|
||||||
|
|
||||||
return time_zones;
|
return time_zones;
|
||||||
}
|
}
|
||||||
|
@ -281,6 +296,7 @@ static void parse_link(StringView link_line, TimeZoneData& time_zone_data)
|
||||||
auto alias = segments[2];
|
auto alias = segments[2];
|
||||||
|
|
||||||
time_zone_data.time_zone_aliases.append({ target, alias });
|
time_zone_data.time_zone_aliases.append({ target, alias });
|
||||||
|
time_zone_data.time_zones_and_links.append({ time_zone_data.time_zone_aliases.last().alias, TimeZone::IsLink::Yes });
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parse_rule(StringView rule_line, TimeZoneData& time_zone_data)
|
static void parse_rule(StringView rule_line, TimeZoneData& time_zone_data)
|
||||||
|
@ -794,9 +810,27 @@ Vector<StringView> time_zones_in_region(StringView region)
|
||||||
}
|
}
|
||||||
)~~~");
|
)~~~");
|
||||||
|
|
||||||
generate_available_values(generator, "all_time_zones"sv, time_zone_data.time_zone_names);
|
quick_sort(time_zone_data.time_zones_and_links, [](auto const& lhs, auto const& rhs) {
|
||||||
|
return lhs.name < rhs.name;
|
||||||
|
});
|
||||||
|
|
||||||
|
generator.set("time_zones_and_links_size", MUST(String::number(time_zone_data.time_zones_and_links.size())));
|
||||||
|
|
||||||
generator.append(R"~~~(
|
generator.append(R"~~~(
|
||||||
|
ReadonlySpan<TimeZoneIdentifier> all_time_zones()
|
||||||
|
{
|
||||||
|
static constexpr Array<TimeZoneIdentifier, @time_zones_and_links_size@> time_zones_and_links { {)~~~");
|
||||||
|
|
||||||
|
bool first = true;
|
||||||
|
for (auto const& zone : time_zone_data.time_zones_and_links) {
|
||||||
|
generator.append(first ? " "sv : ", "sv);
|
||||||
|
generator.append(MUST(String::formatted("{}", zone)));
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
generator.append(R"~~~( } };
|
||||||
|
|
||||||
|
return time_zones_and_links.span();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
)~~~");
|
)~~~");
|
||||||
|
|
|
@ -63,7 +63,17 @@ TimeZoneSettingsWidget::TimeZoneSettingsWidget()
|
||||||
{
|
{
|
||||||
load_from_gml(time_zone_settings_widget_gml).release_value_but_fixme_should_propagate_errors();
|
load_from_gml(time_zone_settings_widget_gml).release_value_but_fixme_should_propagate_errors();
|
||||||
|
|
||||||
static auto time_zones = TimeZone::all_time_zones();
|
static auto time_zones = []() {
|
||||||
|
Vector<StringView> time_zones;
|
||||||
|
|
||||||
|
for (auto const& time_zone : TimeZone::all_time_zones()) {
|
||||||
|
if (time_zone.is_link == TimeZone::IsLink::No)
|
||||||
|
time_zones.append(time_zone.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return time_zones;
|
||||||
|
}();
|
||||||
|
|
||||||
m_time_zone = TimeZone::system_time_zone();
|
m_time_zone = TimeZone::system_time_zone();
|
||||||
|
|
||||||
m_time_zone_combo_box = *find_descendant_of_type_named<GUI::ComboBox>("time_zone_input");
|
m_time_zone_combo_box = *find_descendant_of_type_named<GUI::ComboBox>("time_zone_input");
|
||||||
|
|
|
@ -87,10 +87,10 @@ static Vector<StringView> available_canonical_time_zones()
|
||||||
Vector<StringView> result;
|
Vector<StringView> result;
|
||||||
|
|
||||||
// 3. For each element name of names, do
|
// 3. For each element name of names, do
|
||||||
for (auto name : names) {
|
for (auto const& name : names) {
|
||||||
// a. Assert: IsValidTimeZoneName( name ) is true.
|
// a. Assert: IsValidTimeZoneName( name ) is true.
|
||||||
// b. Let canonical be ! CanonicalizeTimeZoneName( name ).
|
// b. Let canonical be ! CanonicalizeTimeZoneName( name ).
|
||||||
auto canonical = TimeZone::canonicalize_time_zone(name).value();
|
auto canonical = TimeZone::canonicalize_time_zone(name.name).value();
|
||||||
|
|
||||||
// c. If result does not contain an element equal to canonical, then
|
// c. If result does not contain an element equal to canonical, then
|
||||||
if (!result.contains_slow(canonical)) {
|
if (!result.contains_slow(canonical)) {
|
||||||
|
|
|
@ -143,10 +143,10 @@ ErrorOr<void> change_time_zone([[maybe_unused]] StringView time_zone)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ReadonlySpan<StringView> __attribute__((weak)) all_time_zones()
|
ReadonlySpan<TimeZoneIdentifier> __attribute__((weak)) all_time_zones()
|
||||||
{
|
{
|
||||||
#if !ENABLE_TIME_ZONE_DATA
|
#if !ENABLE_TIME_ZONE_DATA
|
||||||
static constexpr auto utc = Array { "UTC"sv };
|
static constexpr auto utc = Array { TimeZoneIdentifier { "UTC"sv, IsLink::No } };
|
||||||
return utc;
|
return utc;
|
||||||
#else
|
#else
|
||||||
return {};
|
return {};
|
||||||
|
|
|
@ -19,6 +19,16 @@
|
||||||
|
|
||||||
namespace TimeZone {
|
namespace TimeZone {
|
||||||
|
|
||||||
|
enum class IsLink {
|
||||||
|
No,
|
||||||
|
Yes,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TimeZoneIdentifier {
|
||||||
|
StringView name;
|
||||||
|
IsLink is_link { IsLink::No };
|
||||||
|
};
|
||||||
|
|
||||||
enum class InDST {
|
enum class InDST {
|
||||||
No,
|
No,
|
||||||
Yes,
|
Yes,
|
||||||
|
@ -52,7 +62,7 @@ struct Location {
|
||||||
StringView system_time_zone();
|
StringView system_time_zone();
|
||||||
StringView current_time_zone();
|
StringView current_time_zone();
|
||||||
ErrorOr<void> change_time_zone(StringView time_zone);
|
ErrorOr<void> change_time_zone(StringView time_zone);
|
||||||
ReadonlySpan<StringView> all_time_zones();
|
ReadonlySpan<TimeZoneIdentifier> all_time_zones();
|
||||||
|
|
||||||
Optional<TimeZone> time_zone_from_string(StringView time_zone);
|
Optional<TimeZone> time_zone_from_string(StringView time_zone);
|
||||||
StringView time_zone_to_string(TimeZone time_zone);
|
StringView time_zone_to_string(TimeZone time_zone);
|
||||||
|
|
|
@ -27,7 +27,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
|
|
||||||
if (list_time_zones) {
|
if (list_time_zones) {
|
||||||
for (auto time_zone : TimeZone::all_time_zones())
|
for (auto time_zone : TimeZone::all_time_zones())
|
||||||
outln("{}", time_zone);
|
outln("{}", time_zone.name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue