From 29ecb2eda6bedebf04e64b30884010cb056e7f9a Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 7 Dec 2023 21:08:06 +0000 Subject: [PATCH] LibWeb: Parse grid-template-areas property using TokenStream --- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 33 ++++++++++++------- Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 2 +- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 76b5a572375..792b73fb529 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -5557,7 +5557,8 @@ RefPtr Parser::parse_grid_track_size_list_shorthand_value(PropertyID template_columns_tokens.append(component_values[x]); } - auto parsed_template_areas_values = parse_grid_template_areas_value(template_area_tokens); + TokenStream template_area_token_stream { template_area_tokens }; + auto parsed_template_areas_values = parse_grid_template_areas_value(template_area_token_stream); auto parsed_template_rows_values = parse_grid_track_size_list(template_rows_tokens, true); auto parsed_template_columns_values = parse_grid_track_size_list(template_columns_tokens); return ShorthandStyleValue::create(property_id, @@ -5651,19 +5652,27 @@ RefPtr Parser::parse_grid_shorthand_value(Vector con return parse_grid_track_size_list_shorthand_value(PropertyID::Grid, component_value); } -RefPtr Parser::parse_grid_template_areas_value(Vector const& component_values) +// https://www.w3.org/TR/css-grid-1/#grid-template-areas-property +RefPtr Parser::parse_grid_template_areas_value(TokenStream& tokens) { + // none | + Vector> grid_area_rows; - for (auto& component_value : component_values) { + + if (contains_single_none_ident(tokens)) { + (void)tokens.next_token(); // none + return GridTemplateAreaStyleValue::create(move(grid_area_rows)); + } + + auto transaction = tokens.begin_transaction(); + while (tokens.has_next_token() && tokens.peek_token().is(Token::Type::String)) { Vector grid_area_columns; - if (component_value.is(Token::Type::String)) { - auto const parts = MUST(MUST(String::from_utf8(component_value.token().string())).split(' ')); - for (auto& part : parts) { - grid_area_columns.append(part); - } + auto const parts = MUST(MUST(String::from_utf8(tokens.next_token().token().string())).split(' ')); + for (auto& part : parts) { + grid_area_columns.append(part); } grid_area_rows.append(move(grid_area_columns)); } + transaction.commit(); return GridTemplateAreaStyleValue::create(grid_area_rows); } @@ -5831,10 +5840,6 @@ Parser::ParseErrorOr> Parser::parse_css_value(Property if (auto parsed_value = parse_grid_auto_flow_value(tokens); parsed_value && !tokens.has_next_token()) return parsed_value.release_nonnull(); return ParseError::SyntaxError; - case PropertyID::GridTemplateAreas: - if (auto parsed_value = parse_grid_template_areas_value(component_values)) - return parsed_value.release_nonnull(); - return ParseError::SyntaxError; case PropertyID::GridColumn: if (auto parsed_value = parse_grid_track_placement_shorthand_value(property_id, tokens); parsed_value && !tokens.has_next_token()) return parsed_value.release_nonnull(); @@ -5867,6 +5872,10 @@ Parser::ParseErrorOr> Parser::parse_css_value(Property if (auto parsed_value = parse_grid_track_size_list_shorthand_value(property_id, component_values)) return parsed_value.release_nonnull(); return ParseError::SyntaxError; + case PropertyID::GridTemplateAreas: + if (auto parsed_value = parse_grid_template_areas_value(tokens); parsed_value && !tokens.has_next_token()) + return parsed_value.release_nonnull(); + return ParseError::SyntaxError; case PropertyID::GridTemplateColumns: if (auto parsed_value = parse_grid_track_size_list(component_values)) return parsed_value.release_nonnull(); diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index b03c593a728..8a02977d57b 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -264,7 +264,7 @@ private: RefPtr parse_grid_track_size_list_shorthand_value(PropertyID, Vector const&); RefPtr parse_grid_track_placement(Vector const&); RefPtr parse_grid_track_placement_shorthand_value(PropertyID, TokenStream&); - RefPtr parse_grid_template_areas_value(Vector const&); + RefPtr parse_grid_template_areas_value(TokenStream&); RefPtr parse_grid_area_shorthand_value(TokenStream&); RefPtr parse_grid_shorthand_value(Vector const&);