-0.009006 2011-05-20
- - Add DESTROY method to fix test failures / warnings in perl >= 5.13.1
-
0.009005 2011-05-12
- Perforce escaping of meta-characters in selectors and test (rafl)
use HTML::Zoom::TransformBuilder;
use Scalar::Util ();
-our $VERSION = '0.009006';
+our $VERSION = '0.009005';
$VERSION = eval $VERSION;
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')";
Jakub Nareski
-Simon Elliot
+Simon Elliott
Joe Highton
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;
- # allow ->add_to_attribute(name => 'value')
- # or ->add_to_attribute({ name => 'name', value => 'value' })
- die "WARNING: Long form arg (name => 'class', value => 'x') is deprecated"
+ warn "WARNING: Long form arg (name => 'class', value => 'x') is deprecated. This may not do what you originally intended..."
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 {
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
},
- ($e # add to name list if not present
- ? ()
- : (attr_names => [ @{$evt->{attr_names}}, $name ]))
+ @kadd ? (attr_names => [ @{$evt->{attr_names}}, @kadd ]) : ()
}
};
}
sub AUTOLOAD {
my ($self, $selector, @args) = @_;
+ my $sel = $self->select($selector);
my $meth = our $AUTOLOAD;
$meth =~ s/.*:://;
- return $self = $self->select($selector)->$meth(@args);
+ 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) = @_;
+ return $self->select($selector)->$meth(@args);
}
sub DESTROY {}
-
+
1;
my $tmpl = <<END;
<body>
- <div class="main">
+ <div name="cow" class="main">
<span class="hilight name">Bob</span>
<span class="career">Builder</span>
<hr />
'set attribute on existing attribute'
);
+($expect = $tmpl) =~ s/name="cow" class="main"/name="bar" class="foo"/;
+
+is(
+ run_for { $_->set_attribute({ 'class' => 'foo', 'name' => 'bar'}) },
+ $expect,
+ 'set attributes using hashref form'
+);
+
($expect = $tmpl) =~ s/class="main"/class="main" foo="bar"/;
is(
is(
HTML::Zoom::Producer::BuiltIn->html_from_events(\@ev),
- '<div class="main">
+ '<div name="cow" class="main">
<span class="hilight name">Bob</span>
<span class="career">Builder</span>
<hr />
is(
run_for { $_->collect({ into => \@ev, content => 1 }) },
'<body>
- <div class="main"></div>
+ <div name="cow" class="main"></div>
</body>
',
'collect w/content removes correctly'
is(
run_for { $_->replace($ohai, { content => 1 }) },
'<body>
- <div class="main">O HAI</div>
+ <div name="cow" class="main">O HAI</div>
</body>
',
'replace w/content'
)
},
q{<body>
- <div class="main">
+ <div name="cow" class="main">
<span class="hilight name">mst</span>
<span class="career">Chainsaw Wielder</span>
<hr />
- </div><div class="main">
+ </div><div name="cow" class="main">
<span class="hilight name">mdk</span>
<span class="career">Adminion</span>
<hr />
)
},
q{<body>
- <div class="main">
+ <div name="cow" class="main">
<span class="hilight name">mst</span>
<span class="career">Chainsaw Wielder</span>
<hr />
)
},
q{<body>
- <div class="main">
+ <div name="cow" class="main">
<span class="hilight name">mst</span>
<span class="career">Chainsaw Wielder</span>
<hr />
)
},
q{<body>
- <div class="main">
+ <div name="cow" class="main">
<span class="hilight name">mst</span>
<span class="career">Chainsaw Wielder</span>
<hr />
'Got correct from repeat_content';
}
+{
+ ok my $dwim = HTML::Zoom
+ ->from_html(q[<ul><li class="foo"></li><li class="bar"></li></ul>])
+ ->replace_content({
+ 'li.foo' => ['foo'],
+ 'li.bar' => ['bar'],
+ })->to_html;
+ is $dwim, '<ul><li class="foo">foo</li><li class="bar">bar</li></ul>',
+ 'Hashref selectors (via replace_content)';
+}
+
+{
+ ok my $dwim = HTML::Zoom
+ ->from_html(q[<ul><li class="foo"></li><li class="bar"></li></ul>])
+ ->set_attribute({
+ 'li.foo' => [ class => 'baz' ],
+ 'li.bar' => [ class => 'qux' ],
+ })->to_html;
+ is $dwim, '<ul><li class="baz"></li><li class="qux"></li></ul>',
+ 'Hashref selectors (via set_attribute)';
+}
+
+{
+ ok my $dwim = HTML::Zoom
+ ->from_html(q[<ul><li class="foo"></li><li class="bar"></li></ul>])
+ ->select('ul')->collect({
+ passthrough => 1,
+ filter => sub {
+ $_->set_attribute({
+ 'li.foo' => [ class => 'baz' ],
+ 'li.bar' => [ class => 'qux' ],
+ });
+ }
+ })->to_html;
+ is $dwim, '<ul><li class="baz"></li><li class="qux"></li></ul>',
+ 'Hashref selectors on codestream';
+}
+
done_testing;