From cd13b30fb871ab521777ce164bff7696aa0fbfca Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Mon, 30 Sep 2024 14:38:17 +0100 Subject: [PATCH] LibWeb/CSS: Add parsing for `` This is a special form of `` so doesn't need its own style value type. It's used in a couple of font-related properties. For completeness it's included in ValueType. --- .../LibWeb/GenerateCSSPropertyID.cpp | 4 +++ .../Libraries/LibWeb/CSS/CSSNumericType.cpp | 3 +- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 30 +++++++++++++++++++ Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 1 + 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPropertyID.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPropertyID.cpp index d9f0b18e428..b0aeafe5051 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPropertyID.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPropertyID.cpp @@ -35,6 +35,7 @@ static bool type_name_is_enum(StringView type_name) "integer"sv, "length"sv, "number"sv, + "opentype-tag"sv, "paint"sv, "percentage"sv, "position"sv, @@ -235,6 +236,7 @@ enum class ValueType { Integer, Length, Number, + OpenTypeTag, Paint, Percentage, Position, @@ -805,6 +807,8 @@ bool property_accepts_type(PropertyID property_id, ValueType value_type) property_generator.appendln(" case ValueType::Length:"); } else if (type_name == "number") { property_generator.appendln(" case ValueType::Number:"); + } else if (type_name == "opentype-tag") { + property_generator.appendln(" case ValueType::OpenTypeTag:"); } else if (type_name == "paint") { property_generator.appendln(" case ValueType::Paint:"); } else if (type_name == "percentage") { diff --git a/Userland/Libraries/LibWeb/CSS/CSSNumericType.cpp b/Userland/Libraries/LibWeb/CSS/CSSNumericType.cpp index fda0f886094..0b52fecff40 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSNumericType.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSNumericType.cpp @@ -42,8 +42,9 @@ Optional CSSNumericType::base_type_from_value_type(Val case ValueType::FilterValueList: case ValueType::Image: case ValueType::Integer: - case ValueType::Paint: case ValueType::Number: + case ValueType::OpenTypeTag: + case ValueType::Paint: case ValueType::Position: case ValueType::Ratio: case ValueType::Rect: diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index a4c2d661de8..5ea94f18d07 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -7899,6 +7899,11 @@ Optional Parser::parse_css_value_for_properties(Readon } } + if (auto property = any_property_accepts_type(property_ids, ValueType::OpenTypeTag); property.has_value()) { + if (auto maybe_rect = parse_opentype_tag_value(tokens)) + return PropertyAndValue { *property, maybe_rect }; + } + if (peek_token.is(Token::Type::Percentage)) { auto percentage = Percentage(peek_token.token().percentage()); if (auto property = any_property_accepts_type(property_ids, ValueType::Percentage); property.has_value() && property_accepts_percentage(*property, percentage)) { @@ -8864,4 +8869,29 @@ bool Parser::substitute_attr_function(DOM::Element& element, FlyString const& pr return false; } +// https://drafts.csswg.org/css-fonts/#typedef-opentype-tag +RefPtr Parser::parse_opentype_tag_value(TokenStream& tokens) +{ + // = + // The is a case-sensitive OpenType feature tag. + // As specified in the OpenType specification [OPENTYPE], feature tags contain four ASCII characters. + // Tag strings longer or shorter than four characters, or containing characters outside the U+20–7E codepoint range are invalid. + + auto transaction = tokens.begin_transaction(); + auto string_value = parse_string_value(tokens); + if (string_value == nullptr) + return nullptr; + + auto string = string_value->string_value().bytes_as_string_view(); + if (string.length() != 4) + return nullptr; + for (char c : string) { + if (c < 0x20 || c > 0x7E) + return nullptr; + } + + transaction.commit(); + return string_value; +} + } diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 1b2c45c6315..e03dc7a758a 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -265,6 +265,7 @@ private: }; RefPtr parse_position_value(TokenStream&, PositionParsingMode = PositionParsingMode::Normal); RefPtr parse_filter_value_list_value(TokenStream&); + RefPtr parse_opentype_tag_value(TokenStream&); RefPtr parse_dimension_value(TokenStream&); RefPtr parse_angle_value(TokenStream&);