diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 97518d2674c..510780946ee 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -1204,6 +1205,55 @@ RefPtr Parser::parse_url_value(TokenStream& tokens) return URLStyleValue::create(*url); } +RefPtr Parser::parse_basic_shape_function(ComponentValue const& component_value) +{ + if (!component_value.is_function()) + return nullptr; + + auto function_name = component_value.function().name().bytes_as_string_view(); + + // FIXME: Implement other shapes. See: https://www.w3.org/TR/css-shapes-1/#basic-shape-functions + if (!function_name.equals_ignoring_ascii_case("polygon"sv)) + return nullptr; + + // polygon() = polygon( <'fill-rule'>? , [ ]# ) + // FIXME: Parse the fill-rule. + auto arguments_tokens = TokenStream { component_value.function().values() }; + auto arguments = parse_a_comma_separated_list_of_component_values(arguments_tokens); + + Vector points; + for (auto& argument : arguments) { + TokenStream argument_tokens { argument }; + + argument_tokens.skip_whitespace(); + auto x_pos = parse_length_percentage(argument_tokens); + if (!x_pos.has_value()) + return nullptr; + + argument_tokens.skip_whitespace(); + auto y_pos = parse_length_percentage(argument_tokens); + if (!y_pos.has_value()) + return nullptr; + + argument_tokens.skip_whitespace(); + if (argument_tokens.has_next_token()) + return nullptr; + + points.append(Polygon::Point { *x_pos, *y_pos }); + } + + return BasicShapeStyleValue::create(Polygon { FillRule::Nonzero, move(points) }); +} + +RefPtr Parser::parse_basic_shape_value(TokenStream& tokens) +{ + auto basic_shape = parse_basic_shape_function(tokens.peek_token()); + if (!basic_shape) + return nullptr; + (void)tokens.next_token(); + return basic_shape; +} + CSSRule* Parser::convert_to_rule(NonnullRefPtr rule) { if (rule->is_at_rule()) { diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index dca9c68668b..43cae50dc91 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -203,6 +203,9 @@ private: Optional parse_url_function(ComponentValue const&); RefPtr parse_url_value(TokenStream&); + RefPtr parse_basic_shape_function(ComponentValue const&); + RefPtr parse_basic_shape_value(TokenStream&); + template Optional> parse_color_stop_list(TokenStream& tokens, auto is_position, auto get_position); Optional> parse_linear_color_stop_list(TokenStream&);