Skip to content

Commit c789089

Browse files
committed
implement :first-child
1 parent d1f53c3 commit c789089

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/jsonselect.js

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

134-
function mn(node, sel, id) {
134+
function mn(node, sel, id, num) {
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);
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+
}
140144

141145
// should we repeat this selector for descendants?
142146
if (sel[0] !== '>' && sel[0].pc !== ":root") sels.push(sel);
@@ -150,21 +154,22 @@
150154
return [m, sels];
151155
}
152156

153-
function forEach(sel, obj, fun, id) {
157+
function forEach(sel, obj, fun, id, num) {
154158
var a = (sel[0] === ',') ? sel.slice(1) : [sel];
155159
var a0 = [];
156160
var call = false;
157161
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);
159163
if (x[0]) call = true;
160164
for (var j = 0; j < x[1].length; j++) a0.push(x[1][j]);
161165
}
162166
if (a0.length && typeof obj === 'object') {
163167
if (a0.length >= 1) a0.unshift(",");
164168
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);
166170
} 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++);
168173
}
169174
}
170175
if (call && fun) fun(obj);

0 commit comments

Comments
 (0)