From 3cba4b6e414d19d7077d5a2ace2adb31300cdcf2 Mon Sep 17 00:00:00 2001 From: martinfalisse Date: Sat, 15 Oct 2022 12:58:32 +0200 Subject: [PATCH] LibWeb: Refactor parsing a GridTrackSize This functionality was duplicated and this way it is more clean. It will also be used when parsing minmax() values. --- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index cf5482aa1c..e5cc384cba 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -5409,6 +5409,28 @@ RefPtr Parser::parse_as_css_value(PropertyID property_id) RefPtr Parser::parse_grid_track_sizes(Vector const& component_values) { + auto parse_grid_track_size = [&](ComponentValue const& component_value) -> Optional { + // FIXME: Parse calc here if necessary + if (component_value.is_function()) + return {}; + auto token = component_value.token(); + if (token.is(Token::Type::Dimension) && token.dimension_unit().equals_ignoring_case("fr"sv)) { + float numeric_value = token.dimension_value(); + if (numeric_value) + return GridTrackSize(numeric_value); + } + if (token.is(Token::Type::Ident) && token.ident().equals_ignoring_case("auto"sv)) + return GridTrackSize::make_auto(); + auto dimension = parse_dimension(token); + if (!dimension.has_value()) + return {}; + if (dimension->is_length()) + return GridTrackSize(dimension->length()); + else if (dimension->is_percentage()) + return GridTrackSize(dimension->percentage()); + return {}; + }; + Vector params; for (auto const& component_value : component_values) { if (component_value.is_function()) { @@ -5453,20 +5475,10 @@ RefPtr Parser::parse_grid_track_sizes(Vector const& } else if (current_component_value.is_block()) { // FIXME: Implement things like grid-template-columns: repeat(1, [col-start] 8); } else { - current_token = current_component_value.token(); - if (current_token.type() == Token::Type::Dimension && current_token.dimension_unit().equals_ignoring_case("fr"sv)) { - float numeric_value = current_token.dimension_value(); - if (numeric_value) - repeat_params.append(GridTrackSize(numeric_value)); - } else { - auto dimension = parse_dimension(current_token); - if (!dimension.has_value()) - return GridTrackSizeStyleValue::create({}); - if (dimension->is_length()) - repeat_params.append(GridTrackSize(dimension->length())); - else if (dimension->is_percentage()) - repeat_params.append(GridTrackSize(dimension->percentage())); - } + auto grid_track_size = parse_grid_track_size(current_component_value); + if (!grid_track_size.has_value()) + return GridTrackSizeStyleValue::create({}); + repeat_params.append(grid_track_size.value()); } part_two_tokens.skip_whitespace(); if (!part_two_tokens.has_next_token()) @@ -5508,22 +5520,10 @@ RefPtr Parser::parse_grid_track_sizes(Vector const& params.append(GridTrackSize(Length::make_auto())); continue; } - if (component_value.token().type() == Token::Type::Dimension) { - float numeric_value = component_value.token().dimension_value(); - auto unit_string = component_value.token().dimension_unit(); - if (unit_string.equals_ignoring_case("fr"sv) && numeric_value) { - params.append(GridTrackSize(numeric_value)); - continue; - } - } - - auto dimension = parse_dimension(component_value); - if (!dimension.has_value()) + auto grid_track_size = parse_grid_track_size(component_value); + if (!grid_track_size.has_value()) return GridTrackSizeStyleValue::create({}); - if (dimension->is_length()) - params.append(GridTrackSize(dimension->length())); - if (dimension->is_percentage()) - params.append(GridTrackSize(dimension->percentage())); + params.append(grid_track_size.value()); } return GridTrackSizeStyleValue::create(params); }