@@ -3,17 +3,17 @@ import postcss from 'postcss';
3
3
const modDelim = process . env . REBEM_MOD_DELIM || '_' ;
4
4
const elemDelim = process . env . REBEM_ELEM_DELIM || '__' ;
5
5
6
- function buildSelector ( block ) {
6
+ function buildSelector ( ctx , mod ) {
7
7
let selector = '.' ;
8
8
9
- if ( block . blockName ) {
10
- selector += block . blockName ;
9
+ if ( ctx . blockName ) {
10
+ selector += ctx . blockName ;
11
11
}
12
- if ( block . elemName ) {
13
- selector += elemDelim + block . elemName ;
12
+ if ( ctx . elemName ) {
13
+ selector += elemDelim + ctx . elemName ;
14
14
}
15
- if ( block . modName ) {
16
- selector += modDelim + block . modName ;
15
+ if ( mod ) {
16
+ selector += modDelim + mod ;
17
17
}
18
18
19
19
return selector ;
@@ -25,10 +25,10 @@ export default postcss.plugin('rebem-css', () => (css) => {
25
25
. replace ( / ( : b l o c k \( .+ ) / g, ( match , rawSelector ) => {
26
26
27
27
// ":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) ;
29
29
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 } ;
32
32
33
33
// Convert all groups to CSS selectors
34
34
// :block(b):mod(m v) -> .b_m_v
@@ -43,25 +43,51 @@ export default postcss.plugin('rebem-css', () => (css) => {
43
43
44
44
let selector = '' ;
45
45
let mathes = null ;
46
+ let requiredBuild = false ;
46
47
47
48
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
+ }
48
65
49
- if ( mathes [ 1 ] === 'block' ) {
50
- blockDecl . blockName = mathes [ 2 ] ;
66
+ if ( tag === 'elem' ) {
67
+ requiredBuild = true ;
68
+ ctx . elemName = value ;
69
+ continue ;
51
70
}
52
71
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 ;
55
78
}
56
79
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 ;
60
85
}
61
86
87
+ requiredBuild = false ;
62
88
}
63
- if ( ! blockDecl . modName ) {
64
- selector += buildSelector ( blockDecl ) ;
89
+ if ( requiredBuild ) {
90
+ selector += buildSelector ( ctx ) ;
65
91
}
66
92
67
93
result . push ( selector ) ;
0 commit comments