X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FHTML%2FZoom%2FStreamBase.pm;h=8fa8d530d8ea42d8e5190161ae17f346feacfd4a;hb=94a3ddd9ea6e8c859f01407cc17c7042ccf34ba0;hp=c04c7b636ad457a59d42835e0db160c484a7a992;hpb=8a1c87d1e064299bf7f854cc7634b47c4c4cd407;p=catagits%2FHTML-Zoom.git diff --git a/lib/HTML/Zoom/StreamBase.pm b/lib/HTML/Zoom/StreamBase.pm index c04c7b6..8fa8d53 100644 --- a/lib/HTML/Zoom/StreamBase.pm +++ b/lib/HTML/Zoom/StreamBase.pm @@ -1,8 +1,7 @@ package HTML::Zoom::StreamBase; -use strict; -use warnings FATAL => 'all'; -use HTML::Zoom::MatchWithoutFilter; +use strictures 1; +use HTML::Zoom::TransformBuilder; sub _zconfig { shift->{_zconfig} } @@ -11,12 +10,28 @@ sub peek { if (exists $self->{_peeked}) { return ($self->{_peeked}); } - if (my ($peeked) = $self->next) { + if (my ($peeked) = $self->_next(1)) { return ($self->{_peeked} = $peeked); } return; } +sub next { + my ($self) = @_; + + # peeked entry so return that + + if (exists $self->{_peeked}) { + if (my $peeked_from = delete $self->{_peeked_from}) { + $peeked_from->next; + } + return (delete $self->{_peeked}); + } + + $self->_next; +} + + sub flatten { my $self = shift; require HTML::Zoom::FlattenedStream; @@ -40,18 +55,25 @@ sub with_filter { $self->_zconfig->stream_utils->wrap_with_filter($self, $match, $filter); } +sub with_transform { + my ($self, $transform) = @_; + $transform->apply_to_stream($self); +} + sub select { my ($self, $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, + filters => [], + proto => $self, + }); } -sub _parse_selector { - my ($self, $selector) = @_; - return $selector if ref($selector); # already a match sub - $self->_zconfig->selector_parser->parse_selector($selector); +sub then { + my ($self) = @_; + # see notes in HTML/Zoom.pm for why this needs to be fixed + $self->select($self->transform->selector); } sub apply { @@ -60,4 +82,27 @@ sub apply { $self->$code; } +sub apply_if { + my ($self, $predicate, $code) = @_; + if($predicate) { + local $_ = $self; + $self->$code; + } + else { + $self; + } +} + +sub to_html { + my ($self) = @_; + $self->_zconfig->producer->html_from_stream($self); +} + +sub AUTOLOAD { + my ($self, $selector, @args) = @_; + my $meth = our $AUTOLOAD; + $meth =~ s/.*:://; + return $self = $self->select($selector)->$meth(@args); +} + 1;