Skip to content

Commit e02f7f2

Browse files
committed
implement :last-child()
1 parent c789089 commit e02f7f2

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

src/jsonselect.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,15 +131,15 @@
131131
return to;
132132
}
133133

134-
function mn(node, sel, id, num) {
134+
function mn(node, sel, id, num, tot) {
135135
var sels = [];
136136
var cs = (sel[0] === '>') ? sel[1] : sel[0];
137137
var m = true;
138138
if (cs.type) m = m && (cs.type === mytypeof(node));
139139
if (cs.id) m = m && (cs.id === id);
140140
if (m && cs.pc) {
141141
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));
143143
}
144144

145145
// should we repeat this selector for descendants?
@@ -154,22 +154,28 @@
154154
return [m, sels];
155155
}
156156

157-
function forEach(sel, obj, fun, id, num) {
157+
function forEach(sel, obj, fun, id, num, tot) {
158158
var a = (sel[0] === ',') ? sel.slice(1) : [sel];
159159
var a0 = [];
160160
var call = false;
161161
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);
163163
if (x[0]) call = true;
164164
for (var j = 0; j < x[1].length; j++) a0.push(x[1][j]);
165165
}
166166
if (a0.length && typeof obj === 'object') {
167167
if (a0.length >= 1) a0.unshift(",");
168168
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);
170170
} 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++;
171177
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);
173179
}
174180
}
175181
if (call && fun) fun(obj);

0 commit comments

Comments
 (0)