|
131 | 131 | return to; |
132 | 132 | } |
133 | 133 |
|
134 | | - function mn(node, sel, id) { |
| 134 | + function mn(node, sel, id, num) { |
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 | + if (m && cs.pc) { |
| 141 | + if (cs.pc === ":first-child") m = (num === 0); |
| 142 | + else if (cs.pc === ":last-child") m = m; // XXX |
| 143 | + } |
140 | 144 |
|
141 | 145 | // should we repeat this selector for descendants? |
142 | 146 | if (sel[0] !== '>' && sel[0].pc !== ":root") sels.push(sel); |
|
150 | 154 | return [m, sels]; |
151 | 155 | } |
152 | 156 |
|
153 | | - function forEach(sel, obj, fun, id) { |
| 157 | + function forEach(sel, obj, fun, id, num) { |
154 | 158 | var a = (sel[0] === ',') ? sel.slice(1) : [sel]; |
155 | 159 | var a0 = []; |
156 | 160 | var call = false; |
157 | 161 | for (var i = 0; i < a.length; i++) { |
158 | | - var x = mn(obj, a[i], id); |
| 162 | + var x = mn(obj, a[i], id, num); |
159 | 163 | if (x[0]) call = true; |
160 | 164 | for (var j = 0; j < x[1].length; j++) a0.push(x[1][j]); |
161 | 165 | } |
162 | 166 | if (a0.length && typeof obj === 'object') { |
163 | 167 | if (a0.length >= 1) a0.unshift(","); |
164 | 168 | if (isArray(obj)) { |
165 | | - for (var i = 0; i < obj.length; i++) forEach(a0, obj[i], fun); |
| 169 | + for (var i = 0; i < obj.length; i++) forEach(a0, obj[i], fun, undefined, i); |
166 | 170 | } else { |
167 | | - for (var k in obj) if (obj.hasOwnProperty(k)) forEach(a0, obj[k], fun, k); |
| 171 | + var i = 0; |
| 172 | + for (var k in obj) if (obj.hasOwnProperty(k)) forEach(a0, obj[k], fun, k, i++); |
168 | 173 | } |
169 | 174 | } |
170 | 175 | if (call && fun) fun(obj); |
|
0 commit comments