1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 14:38:11 +00:00

LibWeb: Sketch out media-query parsing

This does everything except actually parse the individual media queries.
This commit is contained in:
Sam Atkins 2021-09-29 12:56:37 +01:00 committed by Andreas Kling
parent 3e74c194f9
commit 5bbbdb81dc
2 changed files with 63 additions and 0 deletions

View file

@ -632,6 +632,47 @@ Result<Selector::SimpleSelector, Parser::ParsingResult> Parser::parse_simple_sel
return ParsingResult::SyntaxError;
}
NonnullRefPtrVector<MediaQuery> Parser::parse_as_media_query_list()
{
return parse_a_media_query_list(m_token_stream);
}
template<typename T>
NonnullRefPtrVector<MediaQuery> Parser::parse_a_media_query_list(TokenStream<T>& tokens)
{
// https://www.w3.org/TR/mediaqueries-4/#mq-list
auto comma_separated_lists = parse_a_comma_separated_list_of_component_values(tokens);
AK::NonnullRefPtrVector<MediaQuery> media_queries;
for (auto& media_query_parts : comma_separated_lists) {
auto stream = TokenStream(media_query_parts);
media_queries.append(parse_media_query(stream));
}
return media_queries;
}
RefPtr<MediaQuery> Parser::parse_as_media_query()
{
// https://www.w3.org/TR/cssom-1/#parse-a-media-query
auto media_query_list = parse_as_media_query_list();
if (media_query_list.is_empty())
return MediaQuery::create_not_all();
if (media_query_list.size() == 1)
return media_query_list.first();
return nullptr;
}
NonnullRefPtr<MediaQuery> Parser::parse_media_query(TokenStream<StyleComponentValueRule>&)
{
// "A media query that does not match the grammar in the previous section must be replaced by `not all`
// during parsing." - https://www.w3.org/TR/mediaqueries-5/#error-handling
// FIXME: Implement media queries!
return MediaQuery::create_not_all();
}
NonnullRefPtrVector<StyleRule> Parser::consume_a_list_of_rules(bool top_level)
{
return consume_a_list_of_rules(m_token_stream, top_level);
@ -3310,6 +3351,18 @@ Optional<CSS::SelectorList> parse_selector(CSS::ParsingContext const& context, S
return parser.parse_as_selector();
}
RefPtr<CSS::MediaQuery> parse_media_query(CSS::ParsingContext const& context, StringView const& string)
{
CSS::Parser parser(context, string);
return parser.parse_as_media_query();
}
NonnullRefPtrVector<CSS::MediaQuery> parse_media_query_list(CSS::ParsingContext const& context, StringView const& string)
{
CSS::Parser parser(context, string);
return parser.parse_as_media_query_list();
}
RefPtr<CSS::StyleValue> parse_html_length(DOM::Document const& document, StringView const& string)
{
auto integer = string.to_int();