diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 637ae34b2c..debadf3358 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -7,6 +7,9 @@ #include #include +#include +#include +#include #include #include #include @@ -63,13 +66,14 @@ Token Parser::current_token() return m_tokens.at(m_iterator_offset); } -NonnullRefPtrVector Parser::parse_as_stylesheet() +NonnullRefPtr Parser::parse_as_stylesheet() { - auto rules = consume_a_list_of_rules(true); + auto parser_rules = consume_a_list_of_rules(true); + NonnullRefPtrVector rules; dbgln("Printing rules:"); - for (auto& rule : rules) { + for (auto& rule : parser_rules) { dbgln("PRE:"); for (auto& pre : rule.m_prelude) { dbgln("{}", pre.to_string()); @@ -78,12 +82,12 @@ NonnullRefPtrVector Parser::parse_as_stylesheet() dbgln("{}", rule.block().to_string()); dbgln(""); - auto selectors = parse_selectors(rule.m_prelude); - CSS::Selector selector = Selector(move(selectors)); - dump_selector(selector); + auto css_rule = convert_rule(rule); + if (css_rule) + rules.append(*css_rule); } - return rules; + return CSSStyleSheet::create(rules); } Vector Parser::parse_selectors(Vector parts) @@ -696,9 +700,9 @@ Vector Parser::consume_a_list_of_declarations() return list; } -RefPtr Parser::parse_as_rule() +RefPtr Parser::parse_as_rule() { - RefPtr rule; + RefPtr rule; for (;;) { auto maybe_whitespace = peek_token(); @@ -712,12 +716,15 @@ RefPtr Parser::parse_as_rule() if (token.is_eof()) { return {}; - } - - if (token.is_at()) { - rule = consume_an_at_rule(); + } else if (token.is_at()) { + auto at_rule = consume_an_at_rule(); + rule = convert_rule(at_rule); } else { - rule = consume_a_qualified_rule(); + auto qualified_rule = consume_a_qualified_rule(); + if (!qualified_rule) + return {}; + + rule = convert_rule(*qualified_rule); } for (;;) { @@ -736,12 +743,21 @@ RefPtr Parser::parse_as_rule() return {}; } -NonnullRefPtrVector Parser::parse_as_list_of_rules() +NonnullRefPtrVector Parser::parse_as_list_of_rules() { - return consume_a_list_of_rules(false); + auto parsed_rules = consume_a_list_of_rules(false); + NonnullRefPtrVector rules; + + for (auto& rule : parsed_rules) { + auto converted_rule = convert_rule(rule); + if (converted_rule) + rules.append(*converted_rule); + } + + return rules; } -Optional Parser::parse_as_declaration() +Optional Parser::parse_as_declaration() { for (;;) { auto maybe_whitespace = peek_token(); @@ -757,11 +773,16 @@ Optional Parser::parse_as_declaration() return {}; } - return consume_a_declaration(); + auto declaration = consume_a_declaration(); + // FIXME: Return the declaration. + return {}; } -Vector Parser::parse_as_list_of_declarations() +Vector Parser::parse_as_list_of_declarations() { - return consume_a_list_of_declarations(); + auto declarations = consume_a_list_of_declarations(); + + // FIXME: Return the declarations. + return {}; } Optional Parser::parse_as_component_value() @@ -827,4 +848,10 @@ Vector Parser::parse_as_list_of_comma_separated_compone return rules; } + +RefPtr Parser::convert_rule(NonnullRefPtr) +{ + return {}; +} + } diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index db5b997b48..67cc146123 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -21,21 +21,26 @@ namespace Web::CSS { +class CSSStyleSheet; +class CSSRule; +class CSSStyleRule; +struct StyleProperty; + class Parser { public: Parser(const StringView& input, const String& encoding = "utf-8"); ~Parser(); // The normal parser entry point, for parsing stylesheets. - NonnullRefPtrVector parse_as_stylesheet(); + NonnullRefPtr parse_as_stylesheet(); // For the content of at-rules such as @media. It differs from "Parse a stylesheet" in the handling of and . - NonnullRefPtrVector parse_as_list_of_rules(); + NonnullRefPtrVector parse_as_list_of_rules(); // For use by the CSSStyleSheet#insertRule method, and similar functions which might exist, which parse text into a single rule. - RefPtr parse_as_rule(); + RefPtr parse_as_rule(); // Used in @supports conditions. [CSS3-CONDITIONAL] - Optional parse_as_declaration(); + Optional parse_as_declaration(); // For the contents of a style attribute, which parses text into the contents of a single style rule. - Vector parse_as_list_of_declarations(); + Vector parse_as_list_of_declarations(); // For things that need to consume a single value, like the parsing rules for attr(). Optional parse_as_component_value(); // For the contents of presentational attributes, which parse text into a single declaration’s value, or for parsing a stand-alone selector [SELECT] or list of Media Queries [MEDIAQ], as in Selectors API or the media HTML attribute. @@ -80,6 +85,8 @@ private: NonnullRefPtr consume_a_simple_block(); NonnullRefPtr consume_a_function(); + RefPtr convert_rule(NonnullRefPtr); + Tokenizer m_tokenizer; Vector m_tokens; int m_iterator_offset { -1 };