@@ -51,6 +51,13 @@ pub trait DeclarationParser<'i> {
51
51
name : CowRcStr < ' i > ,
52
52
input : & mut Parser < ' i , ' t > ,
53
53
) -> Result < Self :: Declaration , ParseError < ' i , Self :: Error > > ;
54
+
55
+ /// Whether to try to parse qualified rules along with declarations. See
56
+ /// <https://github.com/w3c/csswg-drafts/issues/7961> for the current state of the discussion.
57
+ /// This is a low effort opt-in to be able to experiment with it, but it's likely to be needed
58
+ /// when nesting is less experimental as well (e.g., you probably don't want to allow nesting
59
+ /// in a style attribute anyways).
60
+ fn enable_nesting ( & self ) -> bool { false }
54
61
}
55
62
56
63
/// A trait to provide various parsing of at-rules.
@@ -231,7 +238,9 @@ where
231
238
/// or `Err(())` for an invalid one.
232
239
impl < ' i , ' t , ' a , I , P , E : ' i > Iterator for DeclarationListParser < ' i , ' t , ' a , P >
233
240
where
234
- P : DeclarationParser < ' i , Declaration = I , Error = E > + AtRuleParser < ' i , AtRule = I , Error = E > ,
241
+ P : DeclarationParser < ' i , Declaration = I , Error = E >
242
+ + AtRuleParser < ' i , AtRule = I , Error = E >
243
+ + QualifiedRuleParser < ' i , QualifiedRule = I , Error = E > ,
235
244
{
236
245
type Item = Result < I , ( ParseError < ' i , E > , & ' i str ) > ;
237
246
@@ -244,24 +253,37 @@ where
244
253
}
245
254
Ok ( & Token :: Ident ( ref name) ) => {
246
255
let name = name. clone ( ) ;
247
- let result = {
256
+ let mut result = {
248
257
let parser = & mut self . parser ;
249
258
parse_until_after ( self . input , Delimiter :: Semicolon , |input| {
250
259
input. expect_colon ( ) ?;
251
260
parser. parse_value ( name, input)
252
261
} )
253
262
} ;
263
+
264
+ if result. is_err ( ) && self . parser . enable_nesting ( ) {
265
+ self . input . reset ( & start) ;
266
+ result = parse_qualified_rule ( & start, self . input , & mut self . parser ) ;
267
+ }
268
+
254
269
return Some ( result. map_err ( |e| ( e, self . input . slice_from ( start. position ( ) ) ) ) ) ;
255
270
}
256
271
Ok ( & Token :: AtKeyword ( ref name) ) => {
257
272
let name = name. clone ( ) ;
258
273
return Some ( parse_at_rule ( & start, name, self . input , & mut self . parser ) ) ;
259
274
}
260
275
Ok ( token) => {
261
- let token = token. clone ( ) ;
262
- let result = self . input . parse_until_after ( Delimiter :: Semicolon , |_| {
263
- Err ( start. source_location ( ) . new_unexpected_token_error ( token) )
264
- } ) ;
276
+ let result = if self . parser . enable_nesting ( ) {
277
+ self . input . reset ( & start) ;
278
+ // XXX do we need to, if we fail, consume only until the next semicolon,
279
+ // rather than until the next `{`?
280
+ parse_qualified_rule ( & start, self . input , & mut self . parser )
281
+ } else {
282
+ let token = token. clone ( ) ;
283
+ self . input . parse_until_after ( Delimiter :: Semicolon , |_| {
284
+ Err ( start. source_location ( ) . new_unexpected_token_error ( token) )
285
+ } )
286
+ } ;
265
287
return Some ( result. map_err ( |e| ( e, self . input . slice_from ( start. position ( ) ) ) ) ) ;
266
288
}
267
289
Err ( ..) => return None ,
@@ -367,7 +389,7 @@ where
367
389
}
368
390
} else {
369
391
self . any_rule_so_far = true ;
370
- let result = parse_qualified_rule ( self . input , & mut self . parser ) ;
392
+ let result = parse_qualified_rule ( & start , self . input , & mut self . parser ) ;
371
393
return Some ( result. map_err ( |e| ( e, self . input . slice_from ( start. position ( ) ) ) ) ) ;
372
394
}
373
395
}
@@ -419,7 +441,7 @@ where
419
441
if let Some ( name) = at_keyword {
420
442
parse_at_rule ( & start, name, input, parser) . map_err ( |e| e. 0 )
421
443
} else {
422
- parse_qualified_rule ( input, parser)
444
+ parse_qualified_rule ( & start , input, parser)
423
445
}
424
446
} )
425
447
}
@@ -460,13 +482,13 @@ where
460
482
}
461
483
462
484
fn parse_qualified_rule < ' i , ' t , P , E > (
485
+ start : & ParserState ,
463
486
input : & mut Parser < ' i , ' t > ,
464
487
parser : & mut P ,
465
488
) -> Result < <P as QualifiedRuleParser < ' i > >:: QualifiedRule , ParseError < ' i , E > >
466
489
where
467
490
P : QualifiedRuleParser < ' i , Error = E > ,
468
491
{
469
- let start = input. state ( ) ;
470
492
let prelude = parse_until_before ( input, Delimiter :: CurlyBracketBlock , |input| {
471
493
parser. parse_prelude ( input)
472
494
} ) ;
0 commit comments