@@ -16,6 +16,10 @@ var debug = require('debug')('css-whitespace:parser')
16
16
17
17
module . exports = function ( node ) {
18
18
var indents = 1 ;
19
+ var rules = [ ] ;
20
+ var stash = [ ] ;
21
+ var level = 0 ;
22
+ var nest = 0 ;
19
23
20
24
if ( debug . enabled ) {
21
25
console . log ( util . inspect ( node , false , 12 , true ) ) ;
@@ -32,9 +36,15 @@ module.exports = function(node){
32
36
case 'root' :
33
37
return root ( node ) ;
34
38
case 'rule' :
35
- return rule ( node ) ;
39
+ if ( '@' == node [ 1 ] [ 0 ] ) ++ nest ;
40
+ var ret = rule ( node ) ;
41
+ if ( '@' == node [ 1 ] [ 0 ] ) -- nest ;
42
+ return ret ;
36
43
case 'block' :
37
- return block ( node ) ;
44
+ ++ level ;
45
+ var ret = block ( node ) ;
46
+ -- level ;
47
+ return ret ;
38
48
case 'prop' :
39
49
return prop ( node ) ;
40
50
default :
@@ -47,11 +57,14 @@ module.exports = function(node){
47
57
*/
48
58
49
59
function block ( node ) {
60
+ var buf = [ ] ;
50
61
var nodes = node [ 1 ] ;
51
- ++ indents ;
52
- var ret = nodes . map ( visit ) . join ( '\n' ) ;
53
- -- indents ;
54
- return ret ;
62
+
63
+ for ( var i = 0 ; i < nodes . length ; ++ i ) {
64
+ buf . push ( visit ( nodes [ i ] ) ) ;
65
+ }
66
+
67
+ return buf . join ( '' ) ;
55
68
}
56
69
57
70
/**
@@ -61,7 +74,7 @@ module.exports = function(node){
61
74
function prop ( node ) {
62
75
var prop = node [ 1 ] ;
63
76
var val = node [ 2 ] ;
64
- return indent ( ) + prop + ': ' + val + ';' ;
77
+ return indent ( ) + prop + ': ' + val + ';\n ' ;
65
78
}
66
79
67
80
/**
@@ -74,10 +87,34 @@ module.exports = function(node){
74
87
75
88
if ( ! block ) return rule + ';' ;
76
89
77
- return indent ( ) + rule + ' {\n'
78
- + visit ( block )
79
- + '\n'
80
- + indent ( ) + '}' ;
90
+ rules . push ( node ) ;
91
+
92
+ if ( '@' == rule [ 0 ] ) {
93
+ var buf = join ( rules ) + '{\n'
94
+ visit ( block ) ;
95
+ buf += stash . join ( '\n' ) ;
96
+ buf += '\n}' ;
97
+ stash = [ ] ;
98
+ } else if ( nest ) {
99
+ indents = 2 ;
100
+ var buf = ' ' + join ( rules , 1 ) + '{\n' ;
101
+ buf += visit ( block ) ;
102
+ buf += ' }' ;
103
+ indents = 1 ;
104
+ } else {
105
+ var buf = join ( rules ) + '{\n'
106
+ + visit ( block )
107
+ + '}' ;
108
+ }
109
+
110
+ if ( rules . length > 1 ) {
111
+ if ( hasProperties ( block ) ) stash . push ( buf ) ;
112
+ buf = '' ;
113
+ }
114
+
115
+ rules . pop ( ) ;
116
+
117
+ return buf ;
81
118
}
82
119
83
120
/**
@@ -86,17 +123,72 @@ module.exports = function(node){
86
123
87
124
function root ( node ) {
88
125
var buf = [ ] ;
89
- for ( var i = 0 ; i < node [ 1 ] . length ; ++ i ) {
126
+ for ( var i = 0 ; i < node [ 1 ] . length ; ++ i ) {
90
127
buf . push ( visit ( node [ 1 ] [ i ] ) ) ;
128
+ if ( stash . length ) {
129
+ buf = buf . concat ( stash ) ;
130
+ stash = [ ] ;
131
+ }
91
132
}
92
133
return buf . join ( '\n\n' ) ;
93
134
}
94
135
95
136
/**
96
- * Return current indent.
137
+ * Return indent.
97
138
*/
98
139
99
140
function indent ( ) {
100
- return Array ( indents ) . join ( ' ' ) ;
141
+ return Array ( indents + 1 ) . join ( ' ' ) ;
142
+ }
143
+ } ;
144
+
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 += ' ' ;
101
165
}
102
- } ;
166
+
167
+ return buf ;
168
+ }
169
+
170
+ /**
171
+ * Check if `block` has properties.
172
+ *
173
+ * @param {Array } block
174
+ * @return {Boolean }
175
+ * @api private
176
+ */
177
+
178
+ function hasProperties ( block ) {
179
+ var nodes = block [ 1 ] ;
180
+ for ( var i = 0 ; i < nodes . length ; ++ i ) {
181
+ if ( 'prop' == nodes [ i ] [ 0 ] ) return true ;
182
+ }
183
+ return false ;
184
+ }
185
+
186
+ /**
187
+ * Blank string filter.
188
+ *
189
+ * @api private
190
+ */
191
+
192
+ function blank ( str ) {
193
+ return '' != str ;
194
+ }
0 commit comments