merge helpers
Simon Elliott [Sat, 4 Jun 2011 12:24:43 +0000 (13:24 +0100)]
add remove_from_attribute to make remove_class actually do what it's supposed to.

lib/HTML/Zoom/FilterBuilder.pm
t/actions.t

index 3e48767..c81e642 100644 (file)
@@ -58,7 +58,7 @@ sub add_attribute {
 
 sub add_class { shift->add_to_attribute('class',@_) }
 
-sub remove_class { shift->remove_attribute('class',@_) }
+sub remove_class { shift->remove_from_attribute('class',@_) }
 
 sub set_class { shift->set_attribute('class',@_) }
 
@@ -82,6 +82,22 @@ sub add_to_attribute {
   };
 }
 
+sub remove_from_attribute {
+  my $self = shift;
+  my $attr = $self->_parse_attribute_args(@_);
+  sub {
+    my $a = (my $evt = $_[0])->{attrs};
+    +{ %$evt, raw => undef, raw_attrs => undef,
+       attrs => {
+         %$a,
+         #TODO needs to support multiple removes
+         map { my $tar = $_; $_ => join ' ', 
+          map {$attr->{$tar} ne $_} split ' ', $a->{$_} } keys %$attr
+      },
+    }
+  };
+}
+
 sub remove_attribute {
   my ($self, $args) = @_;
   my $name = (ref($args) eq 'HASH') ? $args->{name} : $args;
@@ -492,8 +508,26 @@ Removes an attribute and all its values.
       ->then
       ->remove_attribute('class');
 
+=head2 remove_from_attribute
+
+Removes a value from existing attribute
+
+    $html_zoom
+      ->select('p')
+      ->set_attribute(class=>'paragraph lead')
+      ->then
+      ->remove_from_attribute('class' => 'lead');
+
 Removes attributes from the original stream or events already added.
 
+=head2 add_class
+
+Add to a class attribute
+
+=head2 remove_class
+
+Remove from a class attribute
+
 =head2 transform_attribute
 
 Transforms (or creates or deletes) an attribute by running the passed
index 6b7c12c..8805a55 100644 (file)
@@ -117,6 +117,14 @@ is(
   'remove attribute on non existing attribute'
 );
 
+($expect = $tmpl) =~ s/class="main"/class=""/;
+
+is(
+  run_for { $_->remove_from_attribute({ class => 'main' }) },
+  $expect,
+  'remove name from attribute'
+);
+
 ($expect = $tmpl) =~ s/ class="main"//;
 
 is(