X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FHTML%2FZoom.pm;h=dba35d343b731d383afa2436850491f8de3818a3;hb=6bf1c7f93a65285e26327a76fbd634c28de460be;hp=fd7602e0f20b97cf86e0fba40d2d061e05fa6cae;hpb=655965b3451d9a284a9601daaa16a3341a45fb8b;p=catagits%2FHTML-Zoom.git diff --git a/lib/HTML/Zoom.pm b/lib/HTML/Zoom.pm index fd7602e..dba35d3 100644 --- a/lib/HTML/Zoom.pm +++ b/lib/HTML/Zoom.pm @@ -4,9 +4,13 @@ use strict; use warnings FATAL => 'all'; use HTML::Zoom::ZConfig; -use HTML::Zoom::MatchWithoutFilter; use HTML::Zoom::ReadFH; use HTML::Zoom::Transform; +use HTML::Zoom::TransformBuilder; + +our $VERSION = '0.009001'; + +$VERSION = eval $VERSION; sub new { my ($class, $args) = @_; @@ -25,13 +29,18 @@ sub _with { bless({ %{$_[0]}, %{$_[1]} }, ref($_[0])); } -sub from_html { +sub from_events { my $self = shift->_self_or_new; $self->_with({ - initial_events => $self->zconfig->parser->html_to_events($_[0]) + initial_events => shift, }); } +sub from_html { + my $self = shift->_self_or_new; + $self->from_events($self->zconfig->parser->html_to_events($_[0])) +} + sub from_file { my $self = shift->_self_or_new; my $filename = shift; @@ -44,14 +53,7 @@ sub to_stream { unless $self->{initial_events}; my $sutils = $self->zconfig->stream_utils; my $stream = $sutils->stream_from_array(@{$self->{initial_events}}); - foreach my $filter_spec (@{$self->{filters}||[]}) { - $stream = HTML::Zoom::Transform->new({ - selector => $filter_spec->[0], - filters => [ $filter_spec->[1] ], - zconfig => $self->zconfig, - })->apply_to_stream($stream); - #$stream = $sutils->wrap_with_filter($stream, @{$filter_spec}); - } + $stream = $_->apply_to_stream($stream) for @{$self->{transforms}||[]}; $stream } @@ -59,9 +61,14 @@ sub to_fh { HTML::Zoom::ReadFH->from_zoom(shift); } +sub to_events { + my $self = shift; + [ $self->zconfig->stream_utils->stream_to_array($self->to_stream) ]; +} + sub run { my $self = shift; - $self->zconfig->stream_utils->stream_to_array($self->to_stream); + $self->to_events; return } @@ -81,22 +88,37 @@ sub memoize { ref($self)->new($self)->from_html($self->to_html); } -sub with_filter { +sub with_transform { my $self = shift->_self_or_new; - my ($selector, $filter) = @_; - my $match = $self->parse_selector($selector); + my ($transform) = @_; $self->_with({ - filters => [ @{$self->{filters}||[]}, [ $match, $filter ] ] + transforms => [ + @{$self->{transforms}||[]}, + $transform + ] }); } + +sub with_filter { + my $self = shift->_self_or_new; + my ($selector, $filter) = @_; + $self->with_transform( + HTML::Zoom::Transform->new({ + zconfig => $self->zconfig, + selector => $selector, + filters => [ $filter ] + }) + ); +} sub select { my $self = shift->_self_or_new; my ($selector) = @_; - my $match = $self->parse_selector($selector); - return HTML::Zoom::MatchWithoutFilter->construct( - $self, $match, $self->zconfig->filter_builder, - ); + return HTML::Zoom::TransformBuilder->new({ + zconfig => $self->zconfig, + selector => $selector, + proto => $self + }); } # There's a bug waiting to happen here: if you do something like @@ -112,15 +134,9 @@ sub select { sub then { my $self = shift; - die "Can't call ->then without a previous filter" - unless $self->{filters}; - $self->select($self->{filters}->[-1][0]); -} - -sub parse_selector { - my ($self, $selector) = @_; - return $selector if ref($selector); # already a match sub - $self->zconfig->selector_parser->parse_selector($selector); + die "Can't call ->then without a previous transform" + unless $self->{transforms}; + $self->select($self->{transforms}->[-1]->selector); } 1; @@ -286,16 +302,16 @@ cleanly: map { my $field = $_; sub { $_->select('label') - ->add_attribute( for => $field->{id} ) + ->add_to_attribute( for => $field->{id} ) ->then ->replace_content( $field->{label} ) ->select('input') - ->add_attribute( name => $field->{name} ) + ->add_to_attribute( name => $field->{name} ) ->then - ->add_attribute( type => $field->{type} ) + ->add_to_attribute( type => $field->{type} ) ->then - ->add_attribute( value => $field->{value} ) + ->add_to_attribute( value => $field->{value} ) } } @fields ]); @@ -676,7 +692,7 @@ In normal usage, you probably don't need to call this yourself. my $z2 = $z1->select('div')->replace_content('I AM A DIV!'); -Returns an intermediary object of the class L +Returns an intermediary object of the class L on which methods of your L object can be called. In normal usage you should generally always put the pair of method calls @@ -684,21 +700,25 @@ together; the intermediary object isn't designed or expected to stick around. =head2 then - my $z2 = $z1->select('div')->add_attribute(class => 'spoon') + my $z2 = $z1->select('div')->add_to_attribute(class => 'spoon') ->then ->replace_content('I AM A DIV!'); Re-runs the previous select to allow you to chain actions together on the same selector. -=head2 parse_selector +=head1 AUTHORS - my $matcher = $zoom->parse_selector('div'); +=over -Used by L and L to invoke the current -L object to create a matcher object (currently -a coderef but this is an implementation detail) for that selector. +=item * Matt S. Trout -In normal usage, you probably don't need to call this yourself. +=back + +=head1 LICENSE + +This library is free software, you can redistribute it and/or modify +it under the same terms as Perl itself. =cut +