From 2fac5e7949ec342c450b2e032509eed0e35cf1ff Mon Sep 17 00:00:00 2001
From: Corey Jewett <cj@syntheticplayground.com>
Date: Fri, 13 Apr 2007 17:48:04 +0000
Subject: [PATCH] Add RegExp style xpath attributes and testcases. e.g. [@foo
 =~ /bar/i] and [@foo !~ /bar/]

---
 src/selector/selector.js     |    5 ++++-
 src/selector/selectorTest.js |    4 +++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/selector/selector.js b/src/selector/selector.js
index 48c6e15..d6d87c0 100644
--- a/src/selector/selector.js
+++ b/src/selector/selector.js
@@ -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*\]/,
diff --git a/src/selector/selectorTest.js b/src/selector/selectorTest.js
index 857d9c7..23f44c3 100644
--- a/src/selector/selectorTest.js
+++ b/src/selector/selectorTest.js
@@ -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"] );
-- 
1.7.10.4