|
131 | 131 | return to; |
132 | 132 | } |
133 | 133 |
|
134 | | - function mn(node, sel, id, num) { |
| 134 | + function mn(node, sel, id, num, tot) { |
135 | 135 | var sels = []; |
136 | 136 | var cs = (sel[0] === '>') ? sel[1] : sel[0]; |
137 | 137 | var m = true; |
138 | 138 | if (cs.type) m = m && (cs.type === mytypeof(node)); |
139 | 139 | if (cs.id) m = m && (cs.id === id); |
140 | 140 | if (m && cs.pc) { |
141 | 141 | if (cs.pc === ":first-child") m = (num === 0); |
142 | | - else if (cs.pc === ":last-child") m = m; // XXX |
| 142 | + else if (cs.pc === ":last-child") m = (num === (tot - 1)); |
143 | 143 | } |
144 | 144 |
|
145 | 145 | // should we repeat this selector for descendants? |
|
154 | 154 | return [m, sels]; |
155 | 155 | } |
156 | 156 |
|
157 | | - function forEach(sel, obj, fun, id, num) { |
| 157 | + function forEach(sel, obj, fun, id, num, tot) { |
158 | 158 | var a = (sel[0] === ',') ? sel.slice(1) : [sel]; |
159 | 159 | var a0 = []; |
160 | 160 | var call = false; |
161 | 161 | for (var i = 0; i < a.length; i++) { |
162 | | - var x = mn(obj, a[i], id, num); |
| 162 | + var x = mn(obj, a[i], id, num, tot); |
163 | 163 | if (x[0]) call = true; |
164 | 164 | for (var j = 0; j < x[1].length; j++) a0.push(x[1][j]); |
165 | 165 | } |
166 | 166 | if (a0.length && typeof obj === 'object') { |
167 | 167 | if (a0.length >= 1) a0.unshift(","); |
168 | 168 | if (isArray(obj)) { |
169 | | - for (var i = 0; i < obj.length; i++) forEach(a0, obj[i], fun, undefined, i); |
| 169 | + for (var i = 0; i < obj.length; i++) forEach(a0, obj[i], fun, undefined, i, obj.length); |
170 | 170 | } else { |
| 171 | + // it's a shame to do this for :last-child and other |
| 172 | + // properties which count from the end when we don't |
| 173 | + // even know if they're present. Also, the stream |
| 174 | + // parser is going to be pissed. |
| 175 | + var l = 0; |
| 176 | + for (var k in obj) if (obj.hasOwnProperty(k)) l++; |
171 | 177 | var i = 0; |
172 | | - for (var k in obj) if (obj.hasOwnProperty(k)) forEach(a0, obj[k], fun, k, i++); |
| 178 | + for (var k in obj) if (obj.hasOwnProperty(k)) forEach(a0, obj[k], fun, k, i++, l); |
173 | 179 | } |
174 | 180 | } |
175 | 181 | if (call && fun) fun(obj); |
|
0 commit comments