1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 05:27:43 +00:00

LibJS+LibUnicode: Align ECMA-402 "sanctioned" terminology with UTS 35

This is an editorial change in the Intl spec. See:
087995c
233d29c

This also adds a missing spec link for the sanctioned units and fixes a
broken spec link for IsSanctionedSingleUnitIdentifier. In LibUnicode,
the NumberFormat generator is updated to use the constexpr helper to
retrieve sanctioned units.
This commit is contained in:
Timothy Flynn 2022-03-28 12:05:18 -04:00 committed by Linus Groh
parent 1a76839e8d
commit 066352c9aa
4 changed files with 24 additions and 26 deletions

View file

@ -140,48 +140,46 @@ bool is_well_formed_currency_code(StringView currency)
// 6.5.1 IsWellFormedUnitIdentifier ( unitIdentifier ), https://tc39.es/ecma402/#sec-iswellformedunitidentifier
bool is_well_formed_unit_identifier(StringView unit_identifier)
{
// 6.5.2 IsSanctionedSimpleUnitIdentifier ( unitIdentifier ), https://tc39.es/ecma402/#sec-iswellformedunitidentifier
constexpr auto is_sanctioned_simple_unit_identifier = [](StringView unit_identifier) {
// 6.5.2 IsSanctionedSingleUnitIdentifier ( unitIdentifier ), https://tc39.es/ecma402/#sec-issanctionedsingleunitidentifier
constexpr auto is_sanctioned_single_unit_identifier = [](StringView unit_identifier) {
// 1. If unitIdentifier is listed in Table 2 below, return true.
// 2. Else, return false.
static constexpr auto sanctioned_units = sanctioned_simple_unit_identifiers();
static constexpr auto sanctioned_units = sanctioned_single_unit_identifiers();
return find(sanctioned_units.begin(), sanctioned_units.end(), unit_identifier) != sanctioned_units.end();
};
// 1. If the result of IsSanctionedSimpleUnitIdentifier(unitIdentifier) is true, then
if (is_sanctioned_simple_unit_identifier(unit_identifier)) {
// 1. If ! IsSanctionedSingleUnitIdentifier(unitIdentifier) is true, then
if (is_sanctioned_single_unit_identifier(unit_identifier)) {
// a. Return true.
return true;
}
// 2. Let i be ! StringIndexOf(unitIdentifier, "-per-", 0).
auto indices = unit_identifier.find_all("-per-"sv);
// 2. If the substring "-per-" does not occur exactly once in unitIdentifier, then
// 3. If i is -1 or ! StringIndexOf(unitIdentifier, "-per-", i + 1) is not -1, then
if (indices.size() != 1) {
// a. Return false.
return false;
}
// 3. Let numerator be the substring of unitIdentifier from the beginning to just before "-per-".
// 4. Assert: The five-character substring "-per-" occurs exactly once in unitIdentifier, at index i.
// NOTE: We skip this because the indices vector being of size 1 already verifies this invariant.
// 5. Let numerator be the substring of unitIdentifier from 0 to i.
auto numerator = unit_identifier.substring_view(0, indices[0]);
// 4. If the result of IsSanctionedSimpleUnitIdentifier(numerator) is false, then
if (!is_sanctioned_simple_unit_identifier(numerator)) {
// a. Return false.
return false;
}
// 5. Let denominator be the substring of unitIdentifier from just after "-per-" to the end.
// 6. Let denominator be the substring of unitIdentifier from i + 5.
auto denominator = unit_identifier.substring_view(indices[0] + 5);
// 6. If the result of IsSanctionedSimpleUnitIdentifier(denominator) is false, then
if (!is_sanctioned_simple_unit_identifier(denominator)) {
// a. Return false.
return false;
// 7. If ! IsSanctionedSingleUnitIdentifier(numerator) and ! IsSanctionedSingleUnitIdentifier(denominator) are both true, then
if (is_sanctioned_single_unit_identifier(numerator) && is_sanctioned_single_unit_identifier(denominator)) {
// a. Return true.
return true;
}
// 7. Return true.
return true;
// 8. Return false.
return false;
}
// 9.2.1 CanonicalizeLocaleList ( locales ), https://tc39.es/ecma402/#sec-canonicalizelocalelist