merge
Simon Elliott [Thu, 28 Feb 2013 12:26:25 +0000 (12:26 +0000)]
1  2 
lib/HTML/Zoom.pm
lib/HTML/Zoom/FilterBuilder.pm

diff --combined lib/HTML/Zoom.pm
@@@ -8,7 -8,7 +8,7 @@@ use HTML::Zoom::Transform
  use HTML::Zoom::TransformBuilder;
  use Scalar::Util ();
  
- our $VERSION = '0.009007_1';
+ our $VERSION = '0.009008';
  
  $VERSION = eval $VERSION;
  
@@@ -155,19 -155,7 +155,19 @@@ sub AUTOLOAD 
    my $sel = $self->select($selector);
    my $meth = our $AUTOLOAD;
    $meth =~ s/.*:://;
 -  if(my $cr = $sel->_zconfig->filter_builder->can($meth)) {
 +  if (ref($selector) eq 'HASH') {
 +    my $ret = $self;
 +    $ret = $ret->_do($_, $meth, @{$selector->{$_}}) for keys %$selector;
 +    $ret;
 +  } else {
 +    $self->_do($selector, $meth, @args);
 +  }
 +}
 +
 +sub _do {
 +  my ($self, $selector, $meth, @args) = @_;
 +  my $sel = $self->select($selector);
 +  if( my $cr = $sel->_zconfig->filter_builder->can($meth)) {
      return $sel->$meth(@args);
    } else {
      die "We can't do $meth on ->select('$selector')";
@@@ -213,14 -201,13 +213,14 @@@ HTML::Zoom - selector based streaming t
              $_->select('.name')->replace_content('Matt')
                ->select('.age')->replace_content('26')
            },
 +          # alternate form
            sub {
 -            $_->select('.name')->replace_content('Mark')
 -              ->select('.age')->replace_content('0x29')
 +            $_->replace_content({'.name' => ['Mark'],'.age' => ['0x29'] })
            },
 +          #alternate alternate form
            sub {
 -            $_->select('.name')->replace_content('Epitaph')
 -              ->select('.age')->replace_content('<redacted>')
 +            $_->replace_content('.name' => 'Epitaph')
 +              ->replace_content('.age' => '<redacted>')
            },
          ],
          { repeat_between => '.between' }
@@@ -343,12 -330,14 +343,12 @@@ cleanly
         ->add_to_attribute( for => $field->{id} )
         ->then
         ->replace_content( $field->{label} )
 -
 -       ->select('input')
 -       ->add_to_attribute( name => $field->{name} )
 -       ->then
 -       ->add_to_attribute( type => $field->{type} )
 -       ->then
 -       ->add_to_attribute( value => $field->{value} )
 -
 +       ->add_to_attribute(
 +        input => { 
 +         name => $field->{name},
 +         type => $field->{type},
 +         value => $field->{value}
 +       })
      } } @fields
    ]);
  
@@@ -28,13 -28,15 +28,13 @@@ sub set_attr { shift->set_attribute(@_)
  
  sub set_attribute {
    my $self = shift;
 -  my ($name, $value) = $self->_parse_attribute_args(@_);
 +  my $attr = $self->_parse_attribute_args(@_);
    sub {
      my $a = (my $evt = $_[0])->{attrs};
 -    my $e = exists $a->{$name};
 +    my @kadd = grep {!exists $a->{$_}} keys %$attr;
      +{ %$evt, raw => undef, raw_attrs => undef,
 -       attrs => { %$a, $name => $value },
 -      ($e # add to name list if not present
 -        ? ()
 -        : (attr_names => [ @{$evt->{attr_names}}, $name ]))
 +       attrs => { %$a, %$attr },
 +       @kadd ? (attr_names => [ @{$evt->{attr_names}}, @kadd ]) : ()
       }
     };
  }
  sub _parse_attribute_args {
    my $self = shift;
  
-   warn "WARNING: Long form arg (name => 'class', value => 'x') is deprecated. This may not do what you originally intended..."
+   die "Long form arg (name => 'class', value => 'x') is no longer supported"
      if(@_ == 1 && $_[0]->{'name'} && $_[0]->{'value'});
 -  my ($name, $value) = @_ > 1 ? @_ : @{$_[0]}{qw(name value)};
 -  return ($name, $self->_zconfig->parser->html_escape($value));
 +    
 +  my $opts = ref($_[0]) eq 'HASH' ? $_[0] : {$_[0] => $_[1]};
 +  for (values %{$opts}) { $self->_zconfig->parser->html_escape($_); }
 +  return $opts;
  }
  
  sub add_attribute {
@@@ -56,7 -56,7 +56,7 @@@
  
  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',@_) }
  
@@@ -64,34 -64,18 +64,34 @@@ sub set_id { shift->set_attribute('id',
  
  sub add_to_attribute {
    my $self = shift;
 -  my ($name, $value) = $self->_parse_attribute_args(@_);
 +  my $attr = $self->_parse_attribute_args(@_);
    sub {
      my $a = (my $evt = $_[0])->{attrs};
 -    my $e = exists $a->{$name};
 +    my @kadd = grep {!exists $a->{$_}} keys %$attr;
      +{ %$evt, raw => undef, raw_attrs => undef,
         attrs => {
           %$a,
 -         $name => join(' ', ($e ? $a->{$name} : ()), $value)
 +         map {$_ => join(' ', (exists $a->{$_} ? $a->{$_} : ()), $attr->{$_}) } 
 +          keys %$attr
 +      },
 +      @kadd ? (attr_names => [ @{$evt->{attr_names}}, @kadd ]) : ()
 +    }
 +  };
 +}
 +
 +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->{$_} }
 +            grep {exists $a->{$_}} keys %$attr
        },
 -      ($e # add to name list if not present
 -        ? ()
 -        : (attr_names => [ @{$evt->{attr_names}}, $name ]))
      }
    };
  }
@@@ -477,7 -461,8 +477,7 @@@ Sets an attribute of a given name to a 
        ->select('p')
        ->set_attribute(class=>'paragraph')
        ->select('div')
 -      ->set_attribute({name=>'class', value=>'divider'});
 -
 +      ->set_attribute({class=>'paragraph', name=>'divider'});
  
  Overrides existing values, if such exist.  When multiple L</set_attribute>
  calls are made against the same or overlapping selection sets, the final
@@@ -488,9 -473,19 +488,9 @@@ call wins
  Adds a value to an existing attribute, or creates one if the attribute does not
  yet exist.  You may call this method with either an Array or HashRef of Args.
  
 -Here's the 'long form' HashRef:
 -
 -    $html_zoom
 -      ->select('p')
 -      ->set_attribute(class=>'paragraph')
 -      ->then
 -      ->add_to_attribute({name=>'class', value=>'divider'});
 -
 -And the exact same effect using the 'short form' Array:
 -
      $html_zoom
        ->select('p')
 -      ->set_attribute(class=>'paragraph')
 +      ->set_attribute({class => 'paragraph', name => 'test'})
        ->then
        ->add_to_attribute(class=>'divider');
  
@@@ -506,26 -501,8 +506,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