@@ -43,8 +43,9 @@ public static function parse(ParserState $parserState, ?CSSList $list = null): ?
4343 $ selectors = [];
4444 $ selectorParts = [];
4545 $ stringWrapperCharacter = null ;
46+ $ functionNestingLevel = 0 ;
4647 $ consumedNextCharacter = false ;
47- static $ stopCharacters = ['{ ' , '} ' , '\'' , '" ' , ', ' ];
48+ static $ stopCharacters = ['{ ' , '} ' , '\'' , '" ' , '( ' , ' ) ' , ' , ' ];
4849 do {
4950 if (!$ consumedNextCharacter ) {
5051 $ selectorParts [] = $ parserState ->consume (1 );
@@ -64,8 +65,21 @@ public static function parse(ParserState $parserState, ?CSSList $list = null): ?
6465 }
6566 }
6667 break ;
67- case ', ' :
68+ case '( ' :
6869 if (!\is_string ($ stringWrapperCharacter )) {
70+ ++$ functionNestingLevel ;
71+ }
72+ break ;
73+ case ') ' :
74+ if (!\is_string ($ stringWrapperCharacter )) {
75+ if ($ functionNestingLevel <= 0 ) {
76+ throw new UnexpectedTokenException ('anything but ' , ') ' );
77+ }
78+ --$ functionNestingLevel ;
79+ }
80+ break ;
81+ case ', ' :
82+ if (!\is_string ($ stringWrapperCharacter ) && $ functionNestingLevel === 0 ) {
6983 $ selectors [] = \implode ('' , $ selectorParts );
7084 $ selectorParts = [];
7185 $ parserState ->consume (1 );
@@ -74,6 +88,9 @@ public static function parse(ParserState $parserState, ?CSSList $list = null): ?
7488 break ;
7589 }
7690 } while (!\in_array ($ nextCharacter , ['{ ' , '} ' ], true ) || \is_string ($ stringWrapperCharacter ));
91+ if ($ functionNestingLevel !== 0 ) {
92+ throw new UnexpectedTokenException (') ' , $ nextCharacter );
93+ }
7794 $ selectors [] = \implode ('' , $ selectorParts ); // add final or only selector
7895 $ result ->setSelectors ($ selectors , $ list );
7996 if ($ parserState ->comes ('{ ' )) {
0 commit comments