LibWeb: Generate pseudo-element code from JSON

Initially, this generates the enum and to/from-string functions. The
JSON itself contains more data than that, but it's unused for now.
This commit is contained in:
Sam Atkins 2025-03-19 14:58:22 +00:00
parent 0ed2e71801
commit ffa1dba96a
Notes: github-actions[bot] 2025-03-24 09:51:30 +00:00
14 changed files with 244 additions and 106 deletions

View file

@ -535,74 +535,6 @@ String serialize_a_group_of_selectors(SelectorList const& selectors)
return MUST(String::join(", "sv, selectors));
}
StringView Selector::PseudoElementSelector::name(PseudoElement pseudo_element)
{
switch (pseudo_element) {
case PseudoElement::Before:
return "before"sv;
case PseudoElement::After:
return "after"sv;
case PseudoElement::FirstLine:
return "first-line"sv;
case PseudoElement::FirstLetter:
return "first-letter"sv;
case PseudoElement::Marker:
return "marker"sv;
case PseudoElement::Track:
return "track"sv;
case PseudoElement::Fill:
return "fill"sv;
case PseudoElement::Thumb:
return "thumb"sv;
case PseudoElement::Placeholder:
return "placeholder"sv;
case PseudoElement::Selection:
return "selection"sv;
case PseudoElement::Backdrop:
return "backdrop"sv;
case PseudoElement::FileSelectorButton:
return "file-selector-button"sv;
case PseudoElement::DetailsContent:
return "details-content"sv;
case PseudoElement::KnownPseudoElementCount:
case PseudoElement::UnknownWebKit:
VERIFY_NOT_REACHED();
}
VERIFY_NOT_REACHED();
}
Optional<Selector::PseudoElementSelector> Selector::PseudoElementSelector::from_string(FlyString const& name)
{
if (name.equals_ignoring_ascii_case("after"sv)) {
return Selector::PseudoElementSelector { PseudoElement::After };
} else if (name.equals_ignoring_ascii_case("before"sv)) {
return Selector::PseudoElementSelector { PseudoElement::Before };
} else if (name.equals_ignoring_ascii_case("first-letter"sv)) {
return Selector::PseudoElementSelector { PseudoElement::FirstLetter };
} else if (name.equals_ignoring_ascii_case("first-line"sv)) {
return Selector::PseudoElementSelector { PseudoElement::FirstLine };
} else if (name.equals_ignoring_ascii_case("marker"sv)) {
return Selector::PseudoElementSelector { PseudoElement::Marker };
} else if (name.equals_ignoring_ascii_case("track"sv)) {
return Selector::PseudoElementSelector { PseudoElement::Track };
} else if (name.equals_ignoring_ascii_case("fill"sv)) {
return Selector::PseudoElementSelector { PseudoElement::Fill };
} else if (name.equals_ignoring_ascii_case("thumb"sv)) {
return Selector::PseudoElementSelector { PseudoElement::Thumb };
} else if (name.equals_ignoring_ascii_case("placeholder"sv)) {
return Selector::PseudoElementSelector { PseudoElement::Placeholder };
} else if (name.equals_ignoring_ascii_case("selection"sv)) {
return Selector::PseudoElementSelector { PseudoElement::Selection };
} else if (name.equals_ignoring_ascii_case("backdrop"sv)) {
return Selector::PseudoElementSelector { PseudoElement::Backdrop };
} else if (name.equals_ignoring_ascii_case("file-selector-button"sv)) {
return Selector::PseudoElementSelector { PseudoElement::FileSelectorButton };
} else if (name.equals_ignoring_ascii_case("details-content"sv)) {
return Selector::PseudoElementSelector { PseudoElement::DetailsContent };
}
return {};
}
NonnullRefPtr<Selector> Selector::relative_to(SimpleSelector const& parent) const
{
// To make us relative to the parent, prepend it to the list of compound selectors,