Handle classes/ids after pseudo-classes

This commit is contained in:
ItsDrike 2025-07-27 18:30:33 +02:00
parent 0545673e61
commit 9f46a6af42
Signed by: ItsDrike
GPG key ID: FA2745890B7048C0
4 changed files with 64 additions and 14 deletions

View file

@ -65,6 +65,14 @@ selector = st.recursive(
),
# Apply pseudo-suffix
st.tuples(s, pseudo_suffixes(s)).map("".join),
# Optionally add classes / id after the pseudo-suffix
st.one_of(
s, # no append, keep as-is
st.tuples(
s,
st.lists(st.one_of(css_class, css_id), min_size=1).map("".join),
).map("".join),
),
),
max_leaves=10,
)

View file

@ -424,6 +424,14 @@ def test_parse_not_with_missing_argument() -> None:
_ = NotPseudoClassSelector.from_pseudo_cls(pseudo)
def test_parse_class_after_pseudo_class() -> None:
tokens = TokenStream([Token(TokenType.PSEUDO_CLASS, ":first-child"), Token(TokenType.CLASS, ".bar")])
sel = parse_tokens(tokens)
assert isinstance(sel, NthChildPseudoClassSelector)
assert isinstance(sel.selector, SimpleSelector)
assert sel.selector.classes == ["bar"]
def test_parse_multiple_combinators() -> None:
# div .parent > .child + .sibling:not(.bar):first-child
tokens = TokenStream(

View file

@ -228,6 +228,7 @@ def test_sibling_selector(selector: str, expected: list[Node]) -> None:
("div:last-child", [SECOND_DIV]),
("div.nonexistent:last-child", []),
(".colour-primary:first-child", [INNER_DIV, SECOND_P]),
(":first-child.colour-primary", [INNER_DIV, SECOND_P]),
],
)
def test_nth_child_selector(selector: str, expected: list[Node]) -> None: