mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 08:08:12 +00:00
LibUnicode: Do not generate data for "generic" calendars
This is not a calendar supported by ECMA-402, so let's not waste space with its data. Further, don't generate "gregorian" as a valid Unicode locale extension keyword. It's an invalid type identifier, thus cannot be used in locales such as "en-u-ca-gregorian".
This commit is contained in:
parent
f02ecc1da2
commit
bf79c73158
3 changed files with 18 additions and 13 deletions
|
@ -151,6 +151,11 @@ static ErrorOr<void> parse_calendars(String locale_calendars_path, UnicodeLocale
|
||||||
};
|
};
|
||||||
|
|
||||||
calendars_object.as_object().for_each_member([&](auto const& calendar_name, JsonValue const& value) {
|
calendars_object.as_object().for_each_member([&](auto const& calendar_name, JsonValue const& value) {
|
||||||
|
// The generic calendar is not a supported Unicode calendar key, so skip it:
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar#unicode_calendar_keys
|
||||||
|
if (calendar_name == "generic"sv)
|
||||||
|
return;
|
||||||
|
|
||||||
auto& calendar = ensure_calendar(calendar_name);
|
auto& calendar = ensure_calendar(calendar_name);
|
||||||
|
|
||||||
if (!locale_data.calendars.contains_slow(calendar_name))
|
if (!locale_data.calendars.contains_slow(calendar_name))
|
||||||
|
|
|
@ -407,12 +407,17 @@ static ErrorOr<void> parse_calendar_keywords(String locale_dates_path, UnicodeLo
|
||||||
auto const& calendars_object = dates_object.as_object().get("calendars"sv);
|
auto const& calendars_object = dates_object.as_object().get("calendars"sv);
|
||||||
|
|
||||||
calendars_object.as_object().for_each_member([&](auto const& calendar_name, JsonValue const&) {
|
calendars_object.as_object().for_each_member([&](auto const& calendar_name, JsonValue const&) {
|
||||||
keyword_values.append(calendar_name);
|
// The generic calendar is not a supported Unicode calendar key, so skip it:
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar#unicode_calendar_keys
|
||||||
|
if (calendar_name == "generic"sv)
|
||||||
|
return;
|
||||||
|
|
||||||
// FIXME: Similar to the calendar aliases defined in GenerateUnicodeDateTimeFormat, this
|
// FIXME: Similar to the calendar aliases defined in GenerateUnicodeDateTimeFormat, this
|
||||||
// should be parsed from BCP47. https://unicode-org.atlassian.net/browse/CLDR-15158
|
// should be parsed from BCP47. https://unicode-org.atlassian.net/browse/CLDR-15158
|
||||||
if (calendar_name == "gregorian"sv)
|
if (calendar_name == "gregorian"sv)
|
||||||
keyword_values.append("gregory"sv);
|
keyword_values.append("gregory"sv);
|
||||||
|
else
|
||||||
|
keyword_values.append(calendar_name);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,32 +21,27 @@ describe("correct behavior", () => {
|
||||||
const en = Intl.DateTimeFormat("en", { calendar: "gregory" });
|
const en = Intl.DateTimeFormat("en", { calendar: "gregory" });
|
||||||
expect(en.resolvedOptions().calendar).toBe("gregory");
|
expect(en.resolvedOptions().calendar).toBe("gregory");
|
||||||
|
|
||||||
const el = Intl.DateTimeFormat("el", { calendar: "generic" });
|
const el = Intl.DateTimeFormat("el", { calendar: "gregory" });
|
||||||
expect(el.resolvedOptions().calendar).toBe("generic");
|
expect(el.resolvedOptions().calendar).toBe("gregory");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("calendar may be set by locale extension", () => {
|
test("calendar may be set by locale extension", () => {
|
||||||
const en = Intl.DateTimeFormat("en-u-ca-gregory");
|
const en = Intl.DateTimeFormat("en-u-ca-gregory");
|
||||||
expect(en.resolvedOptions().calendar).toBe("gregory");
|
expect(en.resolvedOptions().calendar).toBe("gregory");
|
||||||
|
|
||||||
const el = Intl.DateTimeFormat("el-u-ca-generic");
|
const el = Intl.DateTimeFormat("el-u-ca-gregory");
|
||||||
expect(el.resolvedOptions().calendar).toBe("generic");
|
expect(el.resolvedOptions().calendar).toBe("gregory");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("calendar option overrides locale extension", () => {
|
test("calendar option overrides locale extension", () => {
|
||||||
const el = Intl.DateTimeFormat("el-u-ca-generic", { calendar: "gregory" });
|
const el = Intl.DateTimeFormat("el-u-ca-gregory", { calendar: "gregory" });
|
||||||
expect(el.resolvedOptions().calendar).toBe("gregory");
|
expect(el.resolvedOptions().calendar).toBe("gregory");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("calendar option limited to known 'ca' values", () => {
|
test("calendar option limited to known 'ca' values", () => {
|
||||||
["generic", "hello"].forEach(calendar => {
|
["gregory", "hello"].forEach(calendar => {
|
||||||
const en = Intl.DateTimeFormat("en", { calendar: calendar });
|
const en = Intl.DateTimeFormat("en", { calendar: calendar });
|
||||||
expect(en.resolvedOptions().calendar).toBe("generic");
|
expect(en.resolvedOptions().calendar).toBe("gregory");
|
||||||
});
|
|
||||||
|
|
||||||
["generic", "hello"].forEach(calendar => {
|
|
||||||
const en = Intl.DateTimeFormat(`en-u-ca-${calendar}`);
|
|
||||||
expect(en.resolvedOptions().calendar).toBe("generic");
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue