/testing/selenium-core/lib/cssQuery/src/cssQuery-level2.js
http://datanucleus-appengine.googlecode.com/ · JavaScript · 142 lines · 93 code · 18 blank · 31 comment · 17 complexity · 8c1ea18740916e41a4a3b799f0600661 MD5 · raw file
- /*
- cssQuery, version 2.0.2 (2005-08-19)
- Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)
- License: http://creativecommons.org/licenses/LGPL/2.1/
- */
- cssQuery.addModule("css-level2", function() {
- // -----------------------------------------------------------------------
- // selectors
- // -----------------------------------------------------------------------
- // child selector
- selectors[">"] = function($results, $from, $tagName, $namespace) {
- var $element, i, j;
- for (i = 0; i < $from.length; i++) {
- var $subset = childElements($from[i]);
- for (j = 0; ($element = $subset[j]); j++)
- if (compareTagName($element, $tagName, $namespace))
- $results.push($element);
- }
- };
- // sibling selector
- selectors["+"] = function($results, $from, $tagName, $namespace) {
- for (var i = 0; i < $from.length; i++) {
- var $element = nextElementSibling($from[i]);
- if ($element && compareTagName($element, $tagName, $namespace))
- $results.push($element);
- }
- };
- // attribute selector
- selectors["@"] = function($results, $from, $attributeSelectorID) {
- var $test = attributeSelectors[$attributeSelectorID].test;
- var $element, i;
- for (i = 0; ($element = $from[i]); i++)
- if ($test($element)) $results.push($element);
- };
- // -----------------------------------------------------------------------
- // pseudo-classes
- // -----------------------------------------------------------------------
- pseudoClasses["first-child"] = function($element) {
- return !previousElementSibling($element);
- };
- pseudoClasses["lang"] = function($element, $code) {
- $code = new RegExp("^" + $code, "i");
- while ($element && !$element.getAttribute("lang")) $element = $element.parentNode;
- return $element && $code.test($element.getAttribute("lang"));
- };
- // -----------------------------------------------------------------------
- // attribute selectors
- // -----------------------------------------------------------------------
- // constants
- AttributeSelector.NS_IE = /\\:/g;
- AttributeSelector.PREFIX = "@";
- // properties
- AttributeSelector.tests = {};
- // methods
- AttributeSelector.replace = function($match, $attribute, $namespace, $compare, $value) {
- var $key = this.PREFIX + $match;
- if (!attributeSelectors[$key]) {
- $attribute = this.create($attribute, $compare || "", $value || "");
- // store the selector
- attributeSelectors[$key] = $attribute;
- attributeSelectors.push($attribute);
- }
- return attributeSelectors[$key].id;
- };
- AttributeSelector.parse = function($selector) {
- $selector = $selector.replace(this.NS_IE, "|");
- var $match;
- while ($match = $selector.match(this.match)) {
- var $replace = this.replace($match[0], $match[1], $match[2], $match[3], $match[4]);
- $selector = $selector.replace(this.match, $replace);
- }
- return $selector;
- };
- AttributeSelector.create = function($propertyName, $test, $value) {
- var $attributeSelector = {};
- $attributeSelector.id = this.PREFIX + attributeSelectors.length;
- $attributeSelector.name = $propertyName;
- $test = this.tests[$test];
- $test = $test ? $test(this.getAttribute($propertyName), getText($value)) : false;
- $attributeSelector.test = new Function("e", "return " + $test);
- return $attributeSelector;
- };
- AttributeSelector.getAttribute = function($name) {
- switch ($name.toLowerCase()) {
- case "id":
- return "e.id";
- case "class":
- return "e.className";
- case "for":
- return "e.htmlFor";
- case "href":
- if (isMSIE) {
- // IE always returns the full path not the fragment in the href attribute
- // so we RegExp it out of outerHTML. Opera does the same thing but there
- // is no way to get the original attribute.
- return "String((e.outerHTML.match(/href=\\x22?([^\\s\\x22]*)\\x22?/)||[])[1]||'')";
- }
- }
- return "e.getAttribute('" + $name.replace($NAMESPACE, ":") + "')";
- };
- // -----------------------------------------------------------------------
- // attribute selector tests
- // -----------------------------------------------------------------------
- AttributeSelector.tests[""] = function($attribute) {
- return $attribute;
- };
- AttributeSelector.tests["="] = function($attribute, $value) {
- return $attribute + "==" + Quote.add($value);
- };
- AttributeSelector.tests["~="] = function($attribute, $value) {
- return "/(^| )" + regEscape($value) + "( |$)/.test(" + $attribute + ")";
- };
- AttributeSelector.tests["|="] = function($attribute, $value) {
- return "/^" + regEscape($value) + "(-|$)/.test(" + $attribute + ")";
- };
- // -----------------------------------------------------------------------
- // parsing
- // -----------------------------------------------------------------------
- // override parseSelector to parse out attribute selectors
- var _parseSelector = parseSelector;
- parseSelector = function($selector) {
- return _parseSelector(AttributeSelector.parse($selector));
- };
- }); // addModule