Add support for [attr!="value"] selector (attribute not equal)
Jakub Narebski [Sun, 9 Jan 2011 13:09:20 +0000 (14:09 +0100)]
http://api.jquery.com/attribute-not-equal-selector/

  Description: Select elements that either don't have the specified
  attribute, or do have the specified attribute but not with a certain
  value.

  This selector is equivalent to :not([attr="value"]).

lib/HTML/Zoom/SelectorParser.pm
t/selectors.t

index be08175..ef61d93 100644 (file)
@@ -103,6 +103,17 @@ sub _raw_parse_simple_selector {
         }
       };
 
+    # '[attr!=bar]' - attributes doesn't match
+    /\G\[$sel_re!=$match_value_re\]/gc and
+      return do {
+        my $attribute = $1;
+        my $value = $2;
+        sub {
+          ! ($_[0]->{attrs}{$attribute}
+          && $_[0]->{attrs}{$attribute} eq $value);
+        }
+      };
+
     # '[attr]' - match attribute being present:
     /\G\[$sel_re\]/gc and
       return do {
index 6dd32bd..e6be2c2 100644 (file)
@@ -55,7 +55,14 @@ is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
     ->to_html,
     '<div frew="yo">grg</div>'.$stub,
     'E[attr=val] works' );
+
+# el[attr!="foo"]
+is( HTML::Zoom->from_html('<div f="f"></div><div class="quux"></div>'.$stub)
+    ->select('div[class!="waargh"]')
+       ->replace_content('grg')
+    ->to_html,
+    '<div f="f">grg</div><div class="quux">grg</div>'.$stub,
+    'E[attr!="val"] works' );
 
 # el[attr*="foo"]
 is( HTML::Zoom->from_html('<div f="frew goog"></div>'.$stub)