ladybird/Libraries/LibWeb/CSS/GridTrackPlacement.cpp
Callum Law 36e2d25efa LibWeb: Parse grid track placements closer to spec
This brings parsing of grid-row-* and grid-column-* properties (and
their associated shorthands) more inline with spec.

Changes:
- Only set omitted properties for combined-value shorthands (e.g.
  `grid-row: a` rather than `grid-row: a / b`) if the single value is
  `<custom-ident>`.

- `[ [ <integer [-∞,-1]> | <integer [1,∞]> ] && <custom-ident>? ]`:
  - Properly resolve `calc`s for `<integer>` that rely on compute-time
    information.

- `[ span && [ <integer [1,∞]> || <custom-ident> ] ]`
  - Allow `calc`s for `<integer>`
  - Allow `<custom-ident>`

There is still work to be done to properly use these parsed values.

Gains us 46 WPT tests.
2025-07-08 17:26:16 +01:00

41 lines
1.3 KiB
C++

/*
* Copyright (c) 2023, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
* Copyright (c) 2022, Martin Falisse <mfalisse@outlook.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "GridTrackPlacement.h"
#include <AK/StringBuilder.h>
namespace Web::CSS {
String GridTrackPlacement::to_string() const
{
StringBuilder builder;
m_value.visit(
[&](Auto const&) {
builder.append("auto"sv);
},
[&](AreaOrLine const& area_or_line) {
if (area_or_line.line_number.has_value() && area_or_line.name.has_value()) {
builder.appendff("{} {}", area_or_line.line_number->to_string(), *area_or_line.name);
} else if (area_or_line.line_number.has_value()) {
builder.appendff("{}", area_or_line.line_number->to_string());
} else if (area_or_line.name.has_value()) {
builder.appendff("{}", *area_or_line.name);
}
},
[&](Span const& span) {
builder.append("span"sv);
if (!span.name.has_value() || span.value.is_calculated() || span.value.value() != 1)
builder.appendff(" {}", span.value.to_string());
if (span.name.has_value())
builder.appendff(" {}", span.name.value());
});
return MUST(builder.to_string());
}
}