@@ -245,31 +245,17 @@ public Rule CreatePage(Token current)
245245 var token = NextToken ( ) ;
246246 _nodes . Push ( rule ) ;
247247 ParseComments ( ref token ) ;
248- rule . Selector = CreateSelector ( ref token ) ;
249- ParseComments ( ref token ) ;
250248
251- if ( token . Type = = TokenType . CurlyBracketOpen )
249+ if ( token . Type ! = TokenType . CurlyBracketOpen )
252250 {
253- var end = FillDeclarations ( rule . Style ) ;
254- rule . StylesheetText = CreateView ( start , end ) ;
255- _nodes . Pop ( ) ;
256- return rule ;
251+ // A pseudo-selector exists. Parse it prior
252+ // to declarations
253+ // e.g. @page :left{...}
254+ rule . Selector = CreatePageSelector ( ref token ) ;
255+ ParseComments ( ref token ) ;
256+ token = NextToken ( ) ;
257257 }
258258
259- _nodes . Pop ( ) ;
260- return SkipDeclarations ( token ) ;
261- }
262-
263- public Rule CreateMarginRule ( ref Token token )
264- {
265- var rule = new MarginRule ( _parser , token . Data ) ;
266- var start = token . Position ;
267- token = NextToken ( ) ;
268- _nodes . Push ( rule ) ;
269- ParseComments ( ref token ) ;
270- rule . Selector = CreateSelector ( ref token ) ;
271- ParseComments ( ref token ) ;
272-
273259 if ( token . Type == TokenType . CurlyBracketOpen )
274260 {
275261 var end = FillDeclarations ( rule . Style ) ;
@@ -317,6 +303,19 @@ public Rule CreateStyle(Token current)
317303 return rule . Selector != null ? rule : null ;
318304 }
319305
306+ public Rule CreateMarginStyle ( ref Token current )
307+ {
308+ var rule = new MarginStyleRule ( _parser ) ;
309+ var start = current . Position ;
310+ _nodes . Push ( rule ) ;
311+ ParseComments ( ref current ) ;
312+ rule . Selector = CreateMarginSelector ( ref current ) ;
313+ var end = FillDeclarations ( rule . Style ) ;
314+ rule . StylesheetText = CreateView ( start , end ) ;
315+ _nodes . Pop ( ) ;
316+ return rule . Selector != null ? rule : null ;
317+ }
318+
320319 public KeyframeRule CreateKeyframeRule ( Token current )
321320 {
322321 var rule = new KeyframeRule ( _parser ) ;
@@ -445,14 +444,21 @@ public KeyframeSelector CreateKeyframeSelector(ref Token token)
445444 ParseComments ( ref token ) ;
446445 }
447446
448- if ( token . Type == TokenType . Percentage )
449- keys . Add ( new Percent ( ( ( UnitToken ) token ) . Value ) ) ;
450- else if ( token . Type == TokenType . Ident && token . Data . Is ( Keywords . From ) )
451- keys . Add ( Percent . Zero ) ;
452- else if ( token . Type == TokenType . Ident && token . Data . Is ( Keywords . To ) )
453- keys . Add ( Percent . Hundred ) ;
454- else
455- valid = false ;
447+ switch ( token . Type )
448+ {
449+ case TokenType . Percentage :
450+ keys . Add ( new Percent ( ( ( UnitToken ) token ) . Value ) ) ;
451+ break ;
452+ case TokenType . Ident when token . Data . Is ( Keywords . From ) :
453+ keys . Add ( Percent . Zero ) ;
454+ break ;
455+ case TokenType . Ident when token . Data . Is ( Keywords . To ) :
456+ keys . Add ( Percent . Hundred ) ;
457+ break ;
458+ default :
459+ valid = false ;
460+ break ;
461+ }
456462
457463 token = NextToken ( ) ;
458464 ParseComments ( ref token ) ;
@@ -463,6 +469,48 @@ public KeyframeSelector CreateKeyframeSelector(ref Token token)
463469 return new KeyframeSelector ( keys ) ;
464470 }
465471
472+ private PageSelector CreatePageSelector ( ref Token token )
473+ {
474+ PageSelector selector ;
475+
476+ if ( token . Type == TokenType . Colon )
477+ {
478+ // Add the pseudo class selector
479+ token = NextToken ( ) ;
480+ selector = token . Type == TokenType . Ident ? new PageSelector ( token . Data ) : new PageSelector ( ) ;
481+ }
482+ else
483+ {
484+ selector = new PageSelector ( ) ;
485+ }
486+
487+ //var start = token.Position;
488+
489+ //while (token.IsNot(TokenType.EndOfFile, TokenType.CurlyBracketOpen, TokenType.CurlyBracketClose))
490+ //{
491+ // var a = 1;
492+ // token = NextToken();
493+ //}
494+
495+ //var result = selector.ToPool();
496+
497+ //if (result is StylesheetNode node)
498+ //{
499+ // var end = token.Position.Shift(-1);
500+ //node.StylesheetText = CreateView(start, end);
501+ //}
502+
503+ //if (!selectorIsValid && !_parser.Options.AllowInvalidValues)
504+ //{
505+ // RaiseErrorOccurred(ParseError.InvalidSelector, start);
506+ // result = null;
507+ //}
508+
509+ //return result;
510+
511+ return selector ;
512+ }
513+
466514 public List < DocumentFunction > CreateFunctions ( ref Token token )
467515 {
468516 var functions = new List < DocumentFunction > ( ) ;
@@ -492,8 +540,14 @@ public TextPosition FillDeclarations(StyleDeclaration style)
492540 var parentPageRule = _nodes . FirstOrDefault ( parent => parent is PageRule ) ;
493541 if ( parentPageRule != null )
494542 {
495- var genericAtRule = CreateMarginRule ( ref token ) ;
496- parentPageRule . AppendChild ( genericAtRule ) ;
543+ //var genericAtRule = CreateMarginRule(ref token);
544+ //parentPageRule.AppendChild(genericAtRule);
545+ // Rewind to capture the margin's @ symbol
546+
547+ var marginToken = new Token ( TokenType . Ident , token . Data , token . Position ) ;
548+ var marginStyle = CreateMarginStyle ( ref marginToken ) ;
549+ parentPageRule . AppendChild ( marginStyle ) ;
550+ token = marginToken ;
497551 }
498552 }
499553 else
@@ -850,8 +904,7 @@ private IConditionFunction DeclarationCondition(ref Token token)
850904 return declaration ;
851905 }
852906
853- private List < IConditionFunction > MultipleConditions ( IConditionFunction condition , string connector ,
854- ref Token token )
907+ private List < IConditionFunction > MultipleConditions ( IConditionFunction condition , string connector , ref Token token )
855908 {
856909 var list = new List < IConditionFunction > ( ) ;
857910 ParseComments ( ref token ) ;
@@ -1004,6 +1057,35 @@ private ISelector CreateSelector(ref Token token)
10041057 return result ;
10051058 }
10061059
1060+ private ISelector CreateMarginSelector ( ref Token token )
1061+ {
1062+ var selector = _parser . GetSelectorCreator ( ) ;
1063+ var start = token . Position ;
1064+
1065+ while ( token . IsNot ( TokenType . EndOfFile , TokenType . CurlyBracketOpen , TokenType . CurlyBracketClose ) )
1066+ {
1067+ selector . Apply ( token ) ;
1068+ token = NextToken ( ) ;
1069+ }
1070+
1071+ var selectorIsValid = selector . IsValid ;
1072+ var result = selector . ToPool ( ) ;
1073+
1074+ if ( result is StylesheetNode node )
1075+ {
1076+ var end = token . Position . Shift ( - 1 ) ;
1077+ node . StylesheetText = CreateView ( start , end ) ;
1078+ }
1079+
1080+ if ( ! selectorIsValid && ! _parser . Options . AllowInvalidValues )
1081+ {
1082+ RaiseErrorOccurred ( ParseError . InvalidSelector , start ) ;
1083+ result = null ;
1084+ }
1085+
1086+ return result ;
1087+ }
1088+
10071089 private TokenValue CreateValue ( TokenType closing , ref Token token , out bool important )
10081090 {
10091091 var value = Pool . NewValueBuilder ( ) ;
0 commit comments