From a6085e19aeffe9907cdc976e1aa3809ddbe056c8 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Sat, 3 Jul 2021 12:34:25 +0100 Subject: [PATCH] LibWeb: Implement CSS selector parsing entry points They're still using the same parsing code, so there's a lot of room for improvement, but it's good for now. --- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 61 +++++++++++++------ Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 8 ++- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index e12ad96892..b538eb1729 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -97,27 +97,53 @@ NonnullRefPtr Parser::parse_as_stylesheet() auto parser_rules = consume_a_list_of_rules(true); NonnullRefPtrVector rules; - dbgln("Printing rules:"); - - for (auto& rule : parser_rules) { - dbgln("PRE:"); - for (auto& pre : rule.m_prelude) { - dbgln("{}", pre.to_string()); - } - dbgln("BLOCK:"); - dbgln("{}", rule.block().to_string()); - dbgln(""); - - auto css_rule = convert_rule(rule); - if (css_rule) - rules.append(*css_rule); + for (auto& raw_rule : parser_rules) { + auto rule = convert_rule(raw_rule); + if (rule) + rules.append(*rule); } return CSSStyleSheet::create(rules); } -Vector Parser::parse_selectors(Vector parts) +Vector Parser::parse_a_selector() { + auto comma_separated_lists = parse_as_comma_separated_list_of_component_values(); + return parse_a_selector(comma_separated_lists); +} + +Vector Parser::parse_a_selector(Vector>& parts) +{ + Vector selectors; + + for (auto& selector_parts : parts) { + auto selector = parse_single_selector(selector_parts); + if (selector.has_value()) + selectors.append(selector.value()); + } + + return selectors; +} + +Vector Parser::parse_a_relative_selector() +{ + auto comma_separated_lists = parse_as_comma_separated_list_of_component_values(); + + Vector selectors; + + for (auto& selector_parts : comma_separated_lists) { + auto selector = parse_single_selector(selector_parts, true); + if (selector.has_value()) + selectors.append(selector.value()); + } + + return selectors; +} + +Optional Parser::parse_single_selector(Vector parts, bool is_relative) +{ + // FIXME: Bring this all in line with the spec. https://www.w3.org/TR/selectors-4/ + Vector selectors; size_t index = 0; @@ -409,9 +435,10 @@ Vector Parser::parse_selectors(Vector> parse_as_comma_separated_list_of_component_values(); - Vector parse_selectors(Vector parts); + Optional parse_single_selector(Vector parts, bool is_relative = false); // FIXME: https://www.w3.org/TR/selectors-4/ - Optional parse_a_selector() { return {}; } - Optional parse_a_relative_selector() { return {}; } + // Contrary to the name, these parse a comma-separated list of selectors, according to the spec. + Vector parse_a_selector(); + Vector parse_a_selector(Vector>&); + Vector parse_a_relative_selector(); bool match_a_selector_against_an_element() { return false; } bool match_a_selector_against_a_pseudo_element() { return false; } bool match_a_selector_against_a_tree() { return false; }