22
33var Parser = require ( "fastparse" ) ;
44
5+ function unescape ( str ) {
6+ return str . replace ( / \\ ( .) / g, "$1" ) ;
7+ }
8+
59function commentMatch ( match , content ) {
610 this . selector . nodes . push ( {
711 type : "comment" ,
@@ -13,15 +17,15 @@ function typeMatch(type) {
1317 return function ( match , name ) {
1418 this . selector . nodes . push ( {
1519 type : type ,
16- name : name
20+ name : unescape ( name )
1721 } ) ;
1822 } ;
1923}
2024
2125function pseudoClassStartMatch ( match , name ) {
2226 var newToken = {
2327 type : "pseudo-class" ,
24- name : name ,
28+ name : unescape ( name ) ,
2529 content : ""
2630 } ;
2731 this . selector . nodes . push ( newToken ) ;
@@ -37,7 +41,7 @@ function nestedPseudoClassStartMatch(match, name, after) {
3741 } ;
3842 var newToken = {
3943 type : "nested-pseudo-class" ,
40- name : name ,
44+ name : unescape ( name ) ,
4145 nodes : [ newSelector ]
4246 } ;
4347 if ( after ) {
@@ -88,10 +92,10 @@ function spacingMatch(match) {
8892function elementMatch ( match , namespace , name ) {
8993 var newToken = {
9094 type : "element" ,
91- name : name
95+ name : unescape ( name )
9296 } ;
9397 if ( namespace ) {
94- newToken . namespace = namespace . substr ( 0 , namespace . length - 1 ) ;
98+ newToken . namespace = unescape ( namespace . substr ( 0 , namespace . length - 1 ) ) ;
9599 }
96100 this . selector . nodes . push ( newToken ) ;
97101}
@@ -101,7 +105,7 @@ function universalMatch(match, namespace) {
101105 type : "universal"
102106 } ;
103107 if ( namespace ) {
104- newToken . namespace = namespace . substr ( 0 , namespace . length - 1 ) ;
108+ newToken . namespace = unescape ( namespace . substr ( 0 , namespace . length - 1 ) ) ;
105109 }
106110 this . selector . nodes . push ( newToken ) ;
107111}
@@ -162,16 +166,16 @@ function bracketEnd(match) {
162166var parser = new Parser ( {
163167 selector : {
164168 "/\\*([\\s\\S]*?)\\*/" : commentMatch ,
165- "\\.([A-Za-z_\\-0-9]+ )" : typeMatch ( "class" ) ,
166- "#([A-Za-z_\\-0-9]+ )" : typeMatch ( "id" ) ,
169+ "\\.((?:\\\\.| [A-Za-z_\\-])(?:\\\\.|[A-Za-z_\\- 0-9])* )" : typeMatch ( "class" ) ,
170+ "#((?:\\\\.| [A-Za-z_\\-])(?:\\\\.|[A-Za-z_\\- 0-9])* )" : typeMatch ( "id" ) ,
167171 ":(not|has|local|global)\\((\\s*)" : nestedPseudoClassStartMatch ,
168- ":([A-Za-z_\\-0-9]+)\\(" : pseudoClassStartMatch ,
169- ":([A-Za-z_\\-0-9]+)" : typeMatch ( "pseudo-class" ) ,
170- "::([A-Za-z_\\-0-9]+)" : typeMatch ( "pseudo-element" ) ,
171- "(\\*\\|)([A-Za-z_\\-0-9]+)" : elementMatch ,
172+ ":((?:\\\\.| [A-Za-z_\\-0-9]) +)\\(" : pseudoClassStartMatch ,
173+ ":((?:\\\\.| [A-Za-z_\\-0-9]) +)" : typeMatch ( "pseudo-class" ) ,
174+ "::((?:\\\\.| [A-Za-z_\\-0-9]) +)" : typeMatch ( "pseudo-element" ) ,
175+ "(\\*\\|)((?:\\\\.| [A-Za-z_\\-0-9]) +)" : elementMatch ,
172176 "(\\*\\|)\\*" : universalMatch ,
173- "([A-Za-z_\\-0-9]*\\|)?\\*" : universalMatch ,
174- "([A-Za-z_\\-0-9]*\\|)?([A-Za-z_\\-0-9]+)" : elementMatch ,
177+ "((?:\\\\.| [A-Za-z_\\-0-9]) *\\|)?\\*" : universalMatch ,
178+ "((?:\\\\.| [A-Za-z_\\-0-9]) *\\|)?((?:\\\\.| [A-Za-z_\\-0-9]) +)" : elementMatch ,
175179 "\\[([^\\]]+)\\]" : attributeMatch ,
176180 "(\\s*)\\)" : nestedEnd ,
177181 "(\\s*)([>+~])(\\s*)" : operatorMatch ,
0 commit comments