1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 14:38:11 +00:00

LibUnicode: Parse locale private use extensions

This commit is contained in:
Timothy Flynn 2021-08-27 17:51:17 -04:00 committed by Linus Groh
parent 29f76ef7c8
commit 30855e6663
3 changed files with 65 additions and 1 deletions

View file

@ -400,6 +400,45 @@ static Optional<Extension> parse_extension(GenericLexer& lexer)
return {};
}
static Vector<StringView> parse_private_use_extensions(GenericLexer& lexer)
{
// https://unicode.org/reports/tr35/#pu_extensions
//
// pu_extensions = = sep [xX] (sep alphanum{1,8})+ ;
size_t starting_position = lexer.tell();
auto header = consume_next_segment(lexer);
if (!header.has_value())
return {};
auto parse_values = [&]() -> Vector<StringView> {
Vector<StringView> extensions;
while (true) {
auto segment = consume_next_segment(lexer);
if (!segment.has_value())
break;
if ((segment->length() < 1) || (segment->length() > 8) || !all_of(*segment, is_ascii_alphanumeric)) {
lexer.retreat(segment->length() + 1);
break;
}
extensions.append(*segment);
}
return extensions;
};
if ((header->length() == 1) && (((*header)[0] == 'x') || ((*header)[0] == 'X'))) {
if (auto extensions = parse_values(); !extensions.is_empty())
return extensions;
}
lexer.retreat(lexer.tell() - starting_position);
return {};
}
Optional<LanguageID> parse_unicode_language_id(StringView language)
{
GenericLexer lexer { language };
@ -433,7 +472,7 @@ Optional<LocaleID> parse_unicode_locale_id(StringView locale)
locale_id.extensions.append(extension.release_value());
}
// FIXME: Handle pu_extensions.
locale_id.private_use_extensions = parse_private_use_extensions(lexer);
if (!lexer.is_eof())
return {};