@@ -15,7 +15,7 @@ var debug = require('debug')('css-whitespace:parser')
15
15
*/
16
16
17
17
module . exports = function ( node ) {
18
- var indents = 1 ;
18
+ var indents = 0 ;
19
19
var rules = [ ] ;
20
20
var stash = [ ] ;
21
21
var level = 0 ;
@@ -36,9 +36,9 @@ module.exports = function(node){
36
36
case 'root' :
37
37
return root ( node ) ;
38
38
case 'rule' :
39
- if ( '@' == node [ 1 ] [ 0 ] ) ++ nest ;
39
+ if ( '@' == node [ 1 ] [ 0 ] [ 0 ] ) ++ nest ;
40
40
var ret = rule ( node ) ;
41
- if ( '@' == node [ 1 ] [ 0 ] ) -- nest ;
41
+ if ( '@' == node [ 1 ] [ 0 ] [ 0 ] ) -- nest ;
42
42
return ret ;
43
43
case 'block' :
44
44
++ level ;
@@ -84,27 +84,33 @@ module.exports = function(node){
84
84
function rule ( node ) {
85
85
var rule = node [ 1 ] ;
86
86
var block = node [ 2 ] ;
87
+ var buf ;
87
88
88
- if ( ! block ) return rule + ';' ;
89
+ // TODO: tests
90
+ if ( ! block ) return rule . join ( ',\n' ) + ';' ;
89
91
90
92
rules . push ( node ) ;
91
93
92
- if ( '@' == rule [ 0 ] ) {
93
- var buf = join ( rules ) + '{\n'
94
+ if ( '@' == rule [ 0 ] [ 0 ] ) {
95
+ buf = join ( rules ) + '{\n' ;
94
96
visit ( block ) ;
95
97
buf += stash . join ( '\n' ) ;
96
98
buf += '\n}' ;
97
99
stash = [ ] ;
98
100
} else if ( nest ) {
101
+ indents = 1 ;
102
+ buf = join ( rules , 1 ) + ' {\n' ;
99
103
indents = 2 ;
100
- var buf = ' ' + join ( rules , 1 ) + '{\n' ;
101
104
buf += visit ( block ) ;
102
105
buf += ' }' ;
103
106
indents = 1 ;
104
107
} else {
105
- var buf = join ( rules ) + '{\n'
106
- + visit ( block )
107
- + '}' ;
108
+ indents = 0 ;
109
+ buf = join ( rules ) + '{\n'
110
+ indents = 1 ;
111
+ buf += visit ( block ) ;
112
+ indents = 0 ;
113
+ buf += '}' ;
108
114
}
109
115
110
116
if ( rules . length > 1 ) {
@@ -133,6 +139,42 @@ module.exports = function(node){
133
139
return buf . join ( '\n\n' ) ;
134
140
}
135
141
142
+ /**
143
+ * Join the given rules.
144
+ *
145
+ * @param {Array } rules
146
+ * @param {Number } [offset]
147
+ * @return {String }
148
+ * @api private
149
+ */
150
+
151
+ function join ( rules , offset ) {
152
+ offset = offset || 0 ;
153
+ var selectors = [ ] ;
154
+ var buf = [ ] ;
155
+ var curr ;
156
+ var next ;
157
+
158
+ function compile ( rules , i ) {
159
+ if ( offset != i ) {
160
+ rules [ i ] [ 1 ] . forEach ( function ( selector ) {
161
+ buf . unshift ( selector ) ;
162
+ compile ( rules , i - 1 ) ;
163
+ buf . shift ( ) ;
164
+ } ) ;
165
+ } else {
166
+ rules [ i ] [ 1 ] . forEach ( function ( selector ) {
167
+ var tail = buf . join ( ' ' ) ;
168
+ selectors . push ( indent ( ) + selector + ' ' + tail ) ;
169
+ } ) ;
170
+ }
171
+ }
172
+
173
+ compile ( rules , rules . length - 1 ) ;
174
+
175
+ return selectors . join ( ',\n' ) ;
176
+ }
177
+
136
178
/**
137
179
* Return indent.
138
180
*/
@@ -142,31 +184,6 @@ module.exports = function(node){
142
184
}
143
185
} ;
144
186
145
- /**
146
- * Join the given rules.
147
- *
148
- * @param {Array } rules
149
- * @param {Number } [offset]
150
- * @return {String }
151
- * @api private
152
- */
153
-
154
- function join ( rules , offset ) {
155
- var buf = '' ;
156
- var curr ;
157
- var next ;
158
-
159
- for ( var i = offset || 0 ; i < rules . length ; ++ i ) {
160
- curr = rules [ i ] ;
161
- next = rules [ i + 1 ] ;
162
- buf += curr [ 1 ] ;
163
- if ( next && next . parent ) continue ;
164
- buf += ' ' ;
165
- }
166
-
167
- return buf ;
168
- }
169
-
170
187
/**
171
188
* Check if `block` has properties.
172
189
*
0 commit comments