Skip to content

Commit 8cdd66f

Browse files
committed
Fix CSS nesting for nested selectors with comma
1 parent 0019940 commit 8cdd66f

File tree

2 files changed

+27
-18
lines changed

2 files changed

+27
-18
lines changed

tests/css/test_nesting.py

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
'p { div & { width: 10px } width: 20px }',
1414
'div { & { & { p { & { width: 10px } } } } }',
1515
'@media print { div { p { width: 10px } } }',
16+
'div { em, p { width: 10px } }',
17+
'p { a, div & { width: 10px } }',
1618
))
1719
def test_nesting_block(style):
1820
page, = render_pages('''

weasyprint/css/validation/__init__.py

+25-18
Original file line numberDiff line numberDiff line change
@@ -149,26 +149,33 @@ def preprocess_declarations(base_url, declarations, prelude=None):
149149
# Nested rule.
150150
if prelude is None:
151151
continue
152-
declaration_prelude = declaration.prelude
153-
if NESTING_SELECTOR in declaration.prelude:
154-
# Replace & selector by parent.
155-
declaration_prelude = []
156-
for token in declaration.prelude:
157-
if token == NESTING_SELECTOR:
158-
declaration_prelude.extend(is_token)
159-
else:
160-
declaration_prelude.append(token)
161-
else:
162-
# No & selector, prepend parent.
163-
is_token = (
164-
LiteralToken(1, 1, ':'),
165-
FunctionBlock(1, 1, 'is', prelude))
166-
declaration_prelude = [
167-
*is_token, WhitespaceToken(1, 1, ' '),
168-
*declaration.prelude]
152+
declaration_prelude = []
153+
token_groups = [[]]
154+
for token in declaration.prelude:
155+
if token == ',':
156+
token_groups.append([])
157+
else:
158+
token_groups[-1].append(token)
159+
for token_group in token_groups:
160+
if NESTING_SELECTOR in token_group:
161+
# Replace & selector by parent.
162+
for token in declaration.prelude:
163+
if token == NESTING_SELECTOR:
164+
declaration_prelude.extend(is_token)
165+
else:
166+
declaration_prelude.append(token)
167+
else:
168+
# No & selector, prepend parent.
169+
is_token = (
170+
LiteralToken(1, 1, ':'),
171+
FunctionBlock(1, 1, 'is', prelude))
172+
declaration_prelude.extend([
173+
*is_token, WhitespaceToken(1, 1, ' '),
174+
*token_group])
175+
declaration_prelude.append(LiteralToken(1, 1, ','))
169176
yield from preprocess_declarations(
170177
base_url, parse_blocks_contents(declaration.content),
171-
declaration_prelude)
178+
declaration_prelude[:-1])
172179

173180
if declaration.type != 'declaration':
174181
continue

0 commit comments

Comments
 (0)