@@ -3,17 +3,17 @@ import postcss from 'postcss';
33const modDelim = process . env . REBEM_MOD_DELIM || '_' ;
44const elemDelim = process . env . REBEM_ELEM_DELIM || '__' ;
55
6- function buildSelector ( block ) {
6+ function buildSelector ( ctx , mod ) {
77 let selector = '.' ;
88
9- if ( block . blockName ) {
10- selector += block . blockName ;
9+ if ( ctx . blockName ) {
10+ selector += ctx . blockName ;
1111 }
12- if ( block . elemName ) {
13- selector += elemDelim + block . elemName ;
12+ if ( ctx . elemName ) {
13+ selector += elemDelim + ctx . elemName ;
1414 }
15- if ( block . modName ) {
16- selector += modDelim + block . modName ;
15+ if ( mod ) {
16+ selector += modDelim + mod ;
1717 }
1818
1919 return selector ;
@@ -25,10 +25,10 @@ export default postcss.plugin('rebem-css', () => (css) => {
2525 . replace ( / ( : b l o c k \( .+ ) / g, ( match , rawSelector ) => {
2626
2727 // ":block(b):mod(m v) div :block(b2)" -> [":block(b):mod(m v)", "div", "block(b2)"]
28- const groups = rawSelector . split ( / \s + (? ! \w + \) ) / gi) ;
28+ const groups = rawSelector . split ( / \s + (? ! [ \w \s - > ' " , ] + \) ) / gi) ;
2929
30- const re = / : ( b l o c k | e l e m | m o d ) \( ( [ \w - \s ] + ) \) ( \s + ) ? / g;
31- const blockDecl = { blockName : false , elemName : false , modName : false } ;
30+ const re = / ( : + ) ( [ \w - ] + ) ( \( ( [ ' " , \w - > \s ] + ) \) ) ? / g;
31+ const ctx = { blockName : false , elemName : false } ;
3232
3333 // Convert all groups to CSS selectors
3434 // :block(b):mod(m v) -> .b_m_v
@@ -43,25 +43,51 @@ export default postcss.plugin('rebem-css', () => (css) => {
4343
4444 let selector = '' ;
4545 let mathes = null ;
46+ let requiredBuild = false ;
4647
4748 while ( ( mathes = re . exec ( group ) ) !== null ) {
49+ const _spliter = 1 ;
50+ const _tag = 2 ;
51+ const _rawValue = 3 ;
52+ const _value = 4 ;
53+ const spliter = mathes [ _spliter ] ;
54+ const tag = mathes [ _tag ] ;
55+ const rawValue = mathes [ _rawValue ] ;
56+ const value = mathes [ _value ] ?
57+ mathes [ _value ] . replace ( / ( [ \( \) ' " ] ) / g, '' ) . trim ( ) : false ;
58+
59+
60+ if ( tag === 'block' ) {
61+ requiredBuild = true ;
62+ ctx . blockName = value ;
63+ continue ;
64+ }
4865
49- if ( mathes [ 1 ] === 'block' ) {
50- blockDecl . blockName = mathes [ 2 ] ;
66+ if ( tag === 'elem' ) {
67+ requiredBuild = true ;
68+ ctx . elemName = value ;
69+ continue ;
5170 }
5271
53- if ( mathes [ 1 ] === 'elem' ) {
54- blockDecl . elemName = mathes [ 2 ] ;
72+ if ( tag === 'mod' ) {
73+ requiredBuild = false ;
74+ const mod = value . replace ( / ( \s ? - > \s ? | , \s ? | \s + ?) / g, modDelim ) ;
75+
76+ selector += buildSelector ( ctx , mod ) ;
77+ continue ;
5578 }
5679
57- if ( mathes [ 1 ] === 'mod' ) {
58- blockDecl . modName = mathes [ 2 ] . replace ( ' ' , modDelim ) ;
59- selector += buildSelector ( blockDecl ) ;
80+ // For pseudo-classes
81+ selector += requiredBuild ? buildSelector ( ctx ) : '' ;
82+ selector += spliter + tag ;
83+ if ( rawValue ) {
84+ selector += rawValue ;
6085 }
6186
87+ requiredBuild = false ;
6288 }
63- if ( ! blockDecl . modName ) {
64- selector += buildSelector ( blockDecl ) ;
89+ if ( requiredBuild ) {
90+ selector += buildSelector ( ctx ) ;
6591 }
6692
6793 result . push ( selector ) ;
0 commit comments