summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Atkins <atkinssj@gmail.com>2021-07-09 16:34:29 +0100
committerAndreas Kling <kling@serenityos.org>2021-07-11 23:19:56 +0200
commitcaff7fff94e720a4f04520a667eb3eed5947f0ea (patch)
tree655a3a31330404b3d6c066f9529bc63aad3ad4dd
parentf9ffa34622643147fe759d9d7bced2093d4921e1 (diff)
downloadserenity-caff7fff94e720a4f04520a667eb3eed5947f0ea.zip
LibWeb: Convert CSS::Parser methods to return desired types
This is very much stubbed out for now. Most notably is Parser::convert_rule() where most of the conversion will happen from the parser's internal rule classes to CSSRule and its children.
-rw-r--r--Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp67
-rw-r--r--Userland/Libraries/LibWeb/CSS/Parser/Parser.h17
2 files changed, 59 insertions, 25 deletions
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 <AK/NonnullRefPtrVector.h>
#include <AK/SourceLocation.h>
+#include <LibWeb/CSS/CSSStyleDeclaration.h>
+#include <LibWeb/CSS/CSSStyleRule.h>
+#include <LibWeb/CSS/CSSStyleSheet.h>
#include <LibWeb/CSS/Parser/AtStyleRule.h>
#include <LibWeb/CSS/Parser/DeclarationOrAtRule.h>
#include <LibWeb/CSS/Parser/Parser.h>
@@ -63,13 +66,14 @@ Token Parser::current_token()
return m_tokens.at(m_iterator_offset);
}
-NonnullRefPtrVector<QualifiedStyleRule> Parser::parse_as_stylesheet()
+NonnullRefPtr<CSSStyleSheet> Parser::parse_as_stylesheet()
{
- auto rules = consume_a_list_of_rules(true);
+ auto parser_rules = consume_a_list_of_rules(true);
+ NonnullRefPtrVector<CSSRule> 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<QualifiedStyleRule> 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<CSS::Selector::ComplexSelector> Parser::parse_selectors(Vector<StyleComponentValueRule> parts)
@@ -696,9 +700,9 @@ Vector<DeclarationOrAtRule> Parser::consume_a_list_of_declarations()
return list;
}
-RefPtr<QualifiedStyleRule> Parser::parse_as_rule()
+RefPtr<CSSRule> Parser::parse_as_rule()
{
- RefPtr<QualifiedStyleRule> rule;
+ RefPtr<CSSRule> rule;
for (;;) {
auto maybe_whitespace = peek_token();
@@ -712,12 +716,15 @@ RefPtr<QualifiedStyleRule> 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<QualifiedStyleRule> Parser::parse_as_rule()
return {};
}
-NonnullRefPtrVector<QualifiedStyleRule> Parser::parse_as_list_of_rules()
+NonnullRefPtrVector<CSSRule> Parser::parse_as_list_of_rules()
{
- return consume_a_list_of_rules(false);
+ auto parsed_rules = consume_a_list_of_rules(false);
+ NonnullRefPtrVector<CSSRule> rules;
+
+ for (auto& rule : parsed_rules) {
+ auto converted_rule = convert_rule(rule);
+ if (converted_rule)
+ rules.append(*converted_rule);
+ }
+
+ return rules;
}
-Optional<StyleDeclarationRule> Parser::parse_as_declaration()
+Optional<StyleProperty> Parser::parse_as_declaration()
{
for (;;) {
auto maybe_whitespace = peek_token();
@@ -757,11 +773,16 @@ Optional<StyleDeclarationRule> Parser::parse_as_declaration()
return {};
}
- return consume_a_declaration();
+ auto declaration = consume_a_declaration();
+ // FIXME: Return the declaration.
+ return {};
}
-Vector<DeclarationOrAtRule> Parser::parse_as_list_of_declarations()
+Vector<StyleProperty> 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<StyleComponentValueRule> Parser::parse_as_component_value()
@@ -827,4 +848,10 @@ Vector<StyleComponentValueRule> Parser::parse_as_list_of_comma_separated_compone
return rules;
}
+
+RefPtr<CSSRule> Parser::convert_rule(NonnullRefPtr<QualifiedStyleRule>)
+{
+ 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<QualifiedStyleRule> parse_as_stylesheet();
+ NonnullRefPtr<CSSStyleSheet> parse_as_stylesheet();
// For the content of at-rules such as @media. It differs from "Parse a stylesheet" in the handling of <CDO-token> and <CDC-token>.
- NonnullRefPtrVector<QualifiedStyleRule> parse_as_list_of_rules();
+ NonnullRefPtrVector<CSSRule> 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<QualifiedStyleRule> parse_as_rule();
+ RefPtr<CSSRule> parse_as_rule();
// Used in @supports conditions. [CSS3-CONDITIONAL]
- Optional<StyleDeclarationRule> parse_as_declaration();
+ Optional<StyleProperty> parse_as_declaration();
// For the contents of a style attribute, which parses text into the contents of a single style rule.
- Vector<DeclarationOrAtRule> parse_as_list_of_declarations();
+ Vector<StyleProperty> parse_as_list_of_declarations();
// For things that need to consume a single value, like the parsing rules for attr().
Optional<StyleComponentValueRule> 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<StyleBlockRule> consume_a_simple_block();
NonnullRefPtr<StyleFunctionRule> consume_a_function();
+ RefPtr<CSSRule> convert_rule(NonnullRefPtr<QualifiedStyleRule>);
+
Tokenizer m_tokenizer;
Vector<Token> m_tokens;
int m_iterator_offset { -1 };