Add RegExp style xpath attributes and testcases. e.g. [@foo =~ /bar/i] and [@foo...
authorCorey Jewett <cj@syntheticplayground.com>
Fri, 13 Apr 2007 17:48:04 +0000 (17:48 +0000)
committerCorey Jewett <cj@syntheticplayground.com>
Fri, 13 Apr 2007 17:48:04 +0000 (17:48 +0000)
src/selector/selector.js
src/selector/selectorTest.js

index 48c6e15..d6d87c0 100644 (file)
@@ -56,6 +56,9 @@ jQuery.extend({
                        "$=": "z&&z.substr(z.length - m[4].length,m[4].length)==m[4]",
                        "*=": "z&&z.indexOf(m[4])>=0",
                        "": "z",
+                       // these are for evaling in a regexp.
+                       "=~": "eval(m[4]).test(z)",
+                       "!~": "!eval(m[4]).test(z)",
                        _resort: function(m){
                                return ["", m[1], m[3], m[2], m[5]];
                        },
@@ -67,7 +70,7 @@ jQuery.extend({
        // The regular expressions that power the parsing engine
        parse: [
                // Match: [@value='test'], [@foo]
-               /^\[ *(@)([\w-]+) *([!*$^=]*) *('?"?)(.*?)\4 *\]/,
+               /^\[ *(@)([\w-]+) *([!*$^=!~]*) *('?"?)(.*?)\4 *\]/,
 
                // Match: [div], [div p]
                /^(\[)\s*(.*?(\[.*?\])?[^[]*?)\s*\]/,
index 857d9c7..23f44c3 100644 (file)
@@ -183,7 +183,7 @@ test("pseudo (:) selectors", function() {
 });
 
 test("basic xpath", function() {
-       expect(15);
+       expect(17);
        ok( jQuery.find("//*").length >= 30, "All Elements (//*)" );
        t( "All Div Elements", "//div", ["main","foo"] );
        t( "Absolute Path", "/html/body", ["body"] );
@@ -194,6 +194,8 @@ test("basic xpath", function() {
        t( "All Children, Implicit", "//code/", ["anchor1","anchor2"] );
        t( "Attribute Exists", "//a[@title]", ["google"] );
        t( "Attribute Equals", "//a[@rel='bookmark']", ["simon1"] );
+       t( "Attribute RegExp", "//a[@rel=~/BooKmaRk/i]", ["simon1"] );
+       t( "Attribute Inverse RegExp", "//a[@id!~/mon/]", ["google","groups","anchor1","mark","yahoo","anchor2"] );
        t( "Parent Axis", "//p/..", ["main","foo"] );
        t( "Sibling Axis", "//p/../", ["firstp","ap","foo","first","firstUL","empty","form","floatTest","iframe","lengthtest","sndp","en","sap"] );
        t( "Sibling Axis", "//p/../*", ["firstp","ap","foo","first","firstUL","empty","form","floatTest","iframe","lengthtest","sndp","en","sap"] );