forked from kamicane/elements
-
Notifications
You must be signed in to change notification settings - Fork 0
/
traversal.js
80 lines (56 loc) · 1.9 KB
/
traversal.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
traversal
*/"use strict"
var $ = require("./elements"),
array = require("prime/es5/array"),
slick = require("slick")
var walk = function(combinator, method){
return function(expression){
var parts = slick.parse(expression || "*")
expression = array.map(parts, function(part){
return combinator + " " + part
}).join(", ")
return this[method](expression)
}
}
$.implement({
search: function(expression){
if (this.length === 1) return $(slick.search(expression, this[0], new $))
var buffer = []
for (var i = 0, node; node = this[i]; i++) buffer.push.apply(buffer, slick.search(expression, node))
return $(buffer).sort()
},
find: function(expression){
if (this.length === 1) return $(slick.find(expression, this[0]))
var buffer = []
for (var i = 0, node; node = this[i]; i++) buffer.push(slick.find(expression, node))
return $(buffer)
},
sort: function(){
return slick.sort(this)
},
matches: function(expression){
return slick.matches(this[0], expression)
},
nextSiblings: walk("~", "search"),
nextSibling: walk("+", "find"),
previousSiblings: walk("!~", "search"),
previousSibling: walk("!+", "find"),
children: walk(">", "search"),
firstChild: walk("^", "find"),
lastChild: walk("!^", "find"),
parent: function(expression){
for (var i = 0, node; node = this[i]; i++) while ((node = node.parentNode)){
if (!expression || slick.matches(node, expression)) return $(node)
}
return null
},
parents: function(expression){
var buffer = []
for (var i = 0, node; node = this[i]; i++) while ((node = node.parentNode)){
if (!expression || slick.matches(node, expression)) buffer.push(node)
}
return $(buffer)
}
})
module.exports = $