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

LibWeb: Parse minmax() value

Parse the minmax() function when passed to the grid-template-columns or
grid-template-rows CSS property.
This commit is contained in:
martinfalisse 2022-10-15 13:04:24 +02:00 committed by Andreas Kling
parent a5f042b424
commit e227e8027f
3 changed files with 69 additions and 5 deletions

View file

@ -5431,6 +5431,41 @@ RefPtr<StyleValue> Parser::parse_grid_track_sizes(Vector<ComponentValue> const&
return {};
};
auto parse_min_max = [&](Vector<ComponentValue> const& component_values) -> Optional<MetaGridTrackSize> {
// https://www.w3.org/TR/css-grid-2/#valdef-grid-template-columns-minmax
// 'minmax(min, max)'
// Defines a size range greater than or equal to min and less than or equal to max. If the max is
// less than the min, then the max will be floored by the min (essentially yielding minmax(min,
// min)). As a maximum, a <flex> value sets the tracks flex factor; it is invalid as a minimum.
auto function_tokens = TokenStream(component_values);
auto comma_separated_list = parse_a_comma_separated_list_of_component_values(function_tokens);
if (comma_separated_list.size() != 2)
return MetaGridTrackSize(GridTrackSize::make_auto());
TokenStream part_one_tokens { comma_separated_list[0] };
part_one_tokens.skip_whitespace();
if (!part_one_tokens.has_next_token())
return MetaGridTrackSize(GridTrackSize::make_auto());
auto current_token = part_one_tokens.next_token();
auto min_grid_track_size = parse_grid_track_size(current_token);
TokenStream part_two_tokens { comma_separated_list[1] };
part_two_tokens.skip_whitespace();
if (!part_two_tokens.has_next_token())
return MetaGridTrackSize(GridTrackSize::make_auto());
current_token = part_two_tokens.next_token();
auto max_grid_track_size = parse_grid_track_size(current_token);
if (min_grid_track_size.has_value() && max_grid_track_size.has_value()) {
// https://www.w3.org/TR/css-grid-2/#valdef-grid-template-columns-minmax
// As a maximum, a <flex> value sets the tracks flex factor; it is invalid as a minimum.
if (min_grid_track_size.value().is_flexible_length())
return {};
return MetaGridTrackSize(min_grid_track_size.value(), max_grid_track_size.value());
}
return MetaGridTrackSize(GridTrackSize::make_auto(), GridTrackSize::make_auto());
};
Vector<CSS::MetaGridTrackSize> params;
for (auto const& component_value : component_values) {
if (component_value.is_function()) {
@ -5476,8 +5511,14 @@ RefPtr<StyleValue> Parser::parse_grid_track_sizes(Vector<ComponentValue> const&
// The repeat() notation cant be nested.
if (current_component_value.function().name().equals_ignoring_case("repeat"sv))
return GridTrackSizeStyleValue::create({});
// FIXME: Implement MinMax, etc.
if (current_component_value.function().name().equals_ignoring_case("minmax"sv)) {
auto maybe_min_max_value = parse_min_max(current_component_value.function().values());
if (maybe_min_max_value.has_value())
repeat_params.append(maybe_min_max_value.value());
else
return GridTrackSizeStyleValue::create({});
}
// FIXME: Implement other function values possible within repeat
} else if (current_component_value.is_block()) {
// FIXME: Implement things like grid-template-columns: repeat(1, [col-start] 8);
} else {
@ -5518,8 +5559,12 @@ RefPtr<StyleValue> Parser::parse_grid_track_sizes(Vector<ComponentValue> const&
if (is_auto_fit)
return GridTrackSizeStyleValue::create(CSS::ExplicitTrackSizing(repeat_params, CSS::ExplicitTrackSizing::Type::AutoFit));
return GridTrackSizeStyleValue::create(CSS::ExplicitTrackSizing(repeat_params, repeat_count));
} else {
// FIXME: Implement MinMax, etc.
} else if (function_token.name().equals_ignoring_case("minmax"sv)) {
auto maybe_min_max_value = parse_min_max(function_token.values());
if (maybe_min_max_value.has_value())
params.append(maybe_min_max_value.value());
else
return GridTrackSizeStyleValue::create({});
}
continue;
}