11#nullable disable
22namespace AngleSharp . Css . Parser
33{
4+ using AngleSharp . Common ;
45 using AngleSharp . Css . Dom ;
56 using AngleSharp . Css . Parser . Tokens ;
67 using AngleSharp . Dom ;
78 using AngleSharp . Text ;
89 using System ;
10+ using System . Collections . Generic ;
911
1012 /// <summary>
1113 /// See http://dev.w3.org/csswg/css-syntax/#parsing for details.
@@ -14,6 +16,22 @@ sealed class CssBuilder
1416 {
1517 #region Fields
1618
19+ private static readonly Dictionary < String , Int32 > AtRuleMap = new Dictionary < String , Int32 > ( StringComparer . OrdinalIgnoreCase )
20+ {
21+ { RuleNames . Media , 1 } ,
22+ { RuleNames . FontFace , 2 } ,
23+ { RuleNames . Keyframes , 3 } ,
24+ { RuleNames . Import , 4 } ,
25+ { RuleNames . Charset , 5 } ,
26+ { RuleNames . Namespace , 6 } ,
27+ { RuleNames . Page , 7 } ,
28+ { RuleNames . Supports , 8 } ,
29+ { RuleNames . ViewPort , 9 } ,
30+ { RuleNames . Document , 10 } ,
31+ { RuleNames . CounterStyle , 11 } ,
32+ { RuleNames . FontFeatureValues , 12 } ,
33+ } ;
34+
1735 private readonly CssTokenizer _tokenizer ;
1836 private readonly CssParserOptions _options ;
1937 private readonly IBrowsingContext _context ;
@@ -67,67 +85,26 @@ private ICssRule CreateStyleRule(ICssStyleSheet sheet, CssToken token)
6785
6886 private ICssRule CreateAtRule ( ICssStyleSheet sheet , CssToken token )
6987 {
70- if ( token . Data . Is ( RuleNames . Media ) )
71- {
72- var rule = new CssMediaRule ( sheet ) ;
73- return CreateMedia ( rule , token ) ;
74- }
75- else if ( token . Data . Is ( RuleNames . FontFace ) )
76- {
77- var rule = new CssFontFaceRule ( sheet ) ;
78- return CreateFontFace ( rule , token ) ;
79- }
80- else if ( token . Data . Is ( RuleNames . Keyframes ) )
81- {
82- var rule = new CssKeyframesRule ( sheet ) ;
83- return CreateKeyframes ( rule , token ) ;
84- }
85- else if ( token . Data . Is ( RuleNames . Import ) )
86- {
87- var rule = new CssImportRule ( sheet ) ;
88- return CreateImport ( rule , token ) ;
89- }
90- else if ( token . Data . Is ( RuleNames . Charset ) )
91- {
92- var rule = new CssCharsetRule ( sheet ) ;
93- return CreateCharset ( rule , token ) ;
94- }
95- else if ( token . Data . Is ( RuleNames . Namespace ) )
96- {
97- var rule = new CssNamespaceRule ( sheet ) ;
98- return CreateNamespace ( rule , token ) ;
99- }
100- else if ( token . Data . Is ( RuleNames . Page ) )
101- {
102- var rule = new CssPageRule ( sheet ) ;
103- return CreatePage ( rule , token ) ;
104- }
105- else if ( token . Data . Is ( RuleNames . Supports ) )
88+ if ( AtRuleMap . TryGetValue ( token . Data , out var ruleId ) )
10689 {
107- var rule = new CssSupportsRule ( sheet ) ;
108- return CreateSupports ( rule , token ) ;
109- }
110- else if ( token . Data . Is ( RuleNames . ViewPort ) )
111- {
112- var rule = new CssViewportRule ( sheet ) ;
113- return CreateViewport ( rule , token ) ;
114- }
115- else if ( token . Data . Is ( RuleNames . Document ) )
116- {
117- var rule = new CssDocumentRule ( sheet ) ;
118- return CreateDocument ( rule , token ) ;
119- }
120- else if ( token . Data . Is ( RuleNames . CounterStyle ) )
121- {
122- var rule = new CssCounterStyleRule ( sheet ) ;
123- return CreateCounterStyle ( rule , token ) ;
124- }
125- else if ( token . Data . Is ( RuleNames . FontFeatureValues ) )
126- {
127- var rule = new CssFontFeatureValuesRule ( sheet ) ;
128- return CreateFontFeatureValues ( rule , token ) ;
90+ switch ( ruleId )
91+ {
92+ case 1 : return CreateMedia ( new CssMediaRule ( sheet ) , token ) ;
93+ case 2 : return CreateFontFace ( new CssFontFaceRule ( sheet ) , token ) ;
94+ case 3 : return CreateKeyframes ( new CssKeyframesRule ( sheet ) , token ) ;
95+ case 4 : return CreateImport ( new CssImportRule ( sheet ) , token ) ;
96+ case 5 : return CreateCharset ( new CssCharsetRule ( sheet ) , token ) ;
97+ case 6 : return CreateNamespace ( new CssNamespaceRule ( sheet ) , token ) ;
98+ case 7 : return CreatePage ( new CssPageRule ( sheet ) , token ) ;
99+ case 8 : return CreateSupports ( new CssSupportsRule ( sheet ) , token ) ;
100+ case 9 : return CreateViewport ( new CssViewportRule ( sheet ) , token ) ;
101+ case 10 : return CreateDocument ( new CssDocumentRule ( sheet ) , token ) ;
102+ case 11 : return CreateCounterStyle ( new CssCounterStyleRule ( sheet ) , token ) ;
103+ case 12 : return CreateFontFeatureValues ( new CssFontFeatureValuesRule ( sheet ) , token ) ;
104+ }
129105 }
130- else if ( _options . IsIncludingUnknownRules )
106+
107+ if ( _options . IsIncludingUnknownRules )
131108 {
132109 return CreateUnknownAtRule ( sheet , token ) ;
133110 }
@@ -556,10 +533,18 @@ public void CreateDeclarationWith(ICssProperties properties, ref CssToken token)
556533 {
557534 var name = token . Data ;
558535
559- while ( token . Type == CssTokenType . Delim )
536+ if ( token . Type == CssTokenType . Delim )
560537 {
561- token = NextToken ( ) ;
562- name += token . Data ;
538+ var sb = StringBuilderPool . Obtain ( ) ;
539+ sb . Append ( name ) ;
540+
541+ while ( token . Type == CssTokenType . Delim )
542+ {
543+ token = NextToken ( ) ;
544+ sb . Append ( token . Data ) ;
545+ }
546+
547+ name = sb . ToPool ( ) ;
563548 }
564549
565550 token = NextToken ( ) ;
0 commit comments