| 1 |
lars |
1 |
/*
|
|
|
2 |
cssQuery, version 2.0.2 (2005-08-19)
|
|
|
3 |
Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)
|
|
|
4 |
License: http://creativecommons.org/licenses/LGPL/2.1/
|
|
|
5 |
*/
|
|
|
6 |
|
|
|
7 |
cssQuery.addModule("css-level2", function() {
|
|
|
8 |
|
|
|
9 |
// -----------------------------------------------------------------------
|
|
|
10 |
// selectors
|
|
|
11 |
// -----------------------------------------------------------------------
|
|
|
12 |
|
|
|
13 |
// child selector
|
|
|
14 |
selectors[">"] = function($results, $from, $tagName, $namespace) {
|
|
|
15 |
var $element, i, j;
|
|
|
16 |
for (i = 0; i < $from.length; i++) {
|
|
|
17 |
var $subset = childElements($from[i]);
|
|
|
18 |
for (j = 0; ($element = $subset[j]); j++)
|
|
|
19 |
if (compareTagName($element, $tagName, $namespace))
|
|
|
20 |
$results.push($element);
|
|
|
21 |
}
|
|
|
22 |
};
|
|
|
23 |
|
|
|
24 |
// sibling selector
|
|
|
25 |
selectors["+"] = function($results, $from, $tagName, $namespace) {
|
|
|
26 |
for (var i = 0; i < $from.length; i++) {
|
|
|
27 |
var $element = nextElementSibling($from[i]);
|
|
|
28 |
if ($element && compareTagName($element, $tagName, $namespace))
|
|
|
29 |
$results.push($element);
|
|
|
30 |
}
|
|
|
31 |
};
|
|
|
32 |
|
|
|
33 |
// attribute selector
|
|
|
34 |
selectors["@"] = function($results, $from, $attributeSelectorID) {
|
|
|
35 |
var $test = attributeSelectors[$attributeSelectorID].test;
|
|
|
36 |
var $element, i;
|
|
|
37 |
for (i = 0; ($element = $from[i]); i++)
|
|
|
38 |
if ($test($element)) $results.push($element);
|
|
|
39 |
};
|
|
|
40 |
|
|
|
41 |
// -----------------------------------------------------------------------
|
|
|
42 |
// pseudo-classes
|
|
|
43 |
// -----------------------------------------------------------------------
|
|
|
44 |
|
|
|
45 |
pseudoClasses["first-child"] = function($element) {
|
|
|
46 |
return !previousElementSibling($element);
|
|
|
47 |
};
|
|
|
48 |
|
|
|
49 |
pseudoClasses["lang"] = function($element, $code) {
|
|
|
50 |
$code = new RegExp("^" + $code, "i");
|
|
|
51 |
while ($element && !$element.getAttribute("lang")) $element = $element.parentNode;
|
|
|
52 |
return $element && $code.test($element.getAttribute("lang"));
|
|
|
53 |
};
|
|
|
54 |
|
|
|
55 |
// -----------------------------------------------------------------------
|
|
|
56 |
// attribute selectors
|
|
|
57 |
// -----------------------------------------------------------------------
|
|
|
58 |
|
|
|
59 |
// constants
|
|
|
60 |
AttributeSelector.NS_IE = /\\:/g;
|
|
|
61 |
AttributeSelector.PREFIX = "@";
|
|
|
62 |
// properties
|
|
|
63 |
AttributeSelector.tests = {};
|
|
|
64 |
// methods
|
|
|
65 |
AttributeSelector.replace = function($match, $attribute, $namespace, $compare, $value) {
|
|
|
66 |
var $key = this.PREFIX + $match;
|
|
|
67 |
if (!attributeSelectors[$key]) {
|
|
|
68 |
$attribute = this.create($attribute, $compare || "", $value || "");
|
|
|
69 |
// store the selector
|
|
|
70 |
attributeSelectors[$key] = $attribute;
|
|
|
71 |
attributeSelectors.push($attribute);
|
|
|
72 |
}
|
|
|
73 |
return attributeSelectors[$key].id;
|
|
|
74 |
};
|
|
|
75 |
AttributeSelector.parse = function($selector) {
|
|
|
76 |
$selector = $selector.replace(this.NS_IE, "|");
|
|
|
77 |
var $match;
|
|
|
78 |
while ($match = $selector.match(this.match)) {
|
|
|
79 |
var $replace = this.replace($match[0], $match[1], $match[2], $match[3], $match[4]);
|
|
|
80 |
$selector = $selector.replace(this.match, $replace);
|
|
|
81 |
}
|
|
|
82 |
return $selector;
|
|
|
83 |
};
|
|
|
84 |
AttributeSelector.create = function($propertyName, $test, $value) {
|
|
|
85 |
var $attributeSelector = {};
|
|
|
86 |
$attributeSelector.id = this.PREFIX + attributeSelectors.length;
|
|
|
87 |
$attributeSelector.name = $propertyName;
|
|
|
88 |
$test = this.tests[$test];
|
|
|
89 |
$test = $test ? $test(this.getAttribute($propertyName), getText($value)) : false;
|
|
|
90 |
$attributeSelector.test = new Function("e", "return " + $test);
|
|
|
91 |
return $attributeSelector;
|
|
|
92 |
};
|
|
|
93 |
AttributeSelector.getAttribute = function($name) {
|
|
|
94 |
switch ($name.toLowerCase()) {
|
|
|
95 |
case "id":
|
|
|
96 |
return "e.id";
|
|
|
97 |
case "class":
|
|
|
98 |
return "e.className";
|
|
|
99 |
case "for":
|
|
|
100 |
return "e.htmlFor";
|
|
|
101 |
case "href":
|
|
|
102 |
if (isMSIE) {
|
|
|
103 |
// IE always returns the full path not the fragment in the href attribute
|
|
|
104 |
// so we RegExp it out of outerHTML. Opera does the same thing but there
|
|
|
105 |
// is no way to get the original attribute.
|
|
|
106 |
return "String((e.outerHTML.match(/href=\\x22?([^\\s\\x22]*)\\x22?/)||[])[1]||'')";
|
|
|
107 |
}
|
|
|
108 |
}
|
|
|
109 |
return "e.getAttribute('" + $name.replace($NAMESPACE, ":") + "')";
|
|
|
110 |
};
|
|
|
111 |
|
|
|
112 |
// -----------------------------------------------------------------------
|
|
|
113 |
// attribute selector tests
|
|
|
114 |
// -----------------------------------------------------------------------
|
|
|
115 |
|
|
|
116 |
AttributeSelector.tests[""] = function($attribute) {
|
|
|
117 |
return $attribute;
|
|
|
118 |
};
|
|
|
119 |
|
|
|
120 |
AttributeSelector.tests["="] = function($attribute, $value) {
|
|
|
121 |
return $attribute + "==" + Quote.add($value);
|
|
|
122 |
};
|
|
|
123 |
|
|
|
124 |
AttributeSelector.tests["~="] = function($attribute, $value) {
|
|
|
125 |
return "/(^| )" + regEscape($value) + "( |$)/.test(" + $attribute + ")";
|
|
|
126 |
};
|
|
|
127 |
|
|
|
128 |
AttributeSelector.tests["|="] = function($attribute, $value) {
|
|
|
129 |
return "/^" + regEscape($value) + "(-|$)/.test(" + $attribute + ")";
|
|
|
130 |
};
|
|
|
131 |
|
|
|
132 |
// -----------------------------------------------------------------------
|
|
|
133 |
// parsing
|
|
|
134 |
// -----------------------------------------------------------------------
|
|
|
135 |
|
|
|
136 |
// override parseSelector to parse out attribute selectors
|
|
|
137 |
var _parseSelector = parseSelector;
|
|
|
138 |
parseSelector = function($selector) {
|
|
|
139 |
return _parseSelector(AttributeSelector.parse($selector));
|
|
|
140 |
};
|
|
|
141 |
|
|
|
142 |
}); // addModule
|