X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FHTML%2FZoom.pm;h=1af6a0b9413614d16dd3f7691c0aea267f8cac7b;hb=2d0662c077bfd275682acfad25d407e0724ec34f;hp=043c165e8f044ede67b95541168c90d272ea43bf;hpb=7567494ddf22aeffba3a722ba11c084116a75a77;p=catagits%2FHTML-Zoom.git diff --git a/lib/HTML/Zoom.pm b/lib/HTML/Zoom.pm index 043c165..1af6a0b 100644 --- a/lib/HTML/Zoom.pm +++ b/lib/HTML/Zoom.pm @@ -1,12 +1,16 @@ package HTML::Zoom; -use strict; -use warnings FATAL => 'all'; +use strictures 1; use HTML::Zoom::ZConfig; use HTML::Zoom::ReadFH; use HTML::Zoom::Transform; use HTML::Zoom::TransformBuilder; +use Scalar::Util (); + +our $VERSION = '0.009006'; + +$VERSION = eval $VERSION; sub new { my ($class, $args) = @_; @@ -74,6 +78,17 @@ sub apply { $self->$code; } +sub apply_if { + my ($self, $predicate, $code) = @_; + if($predicate) { + local $_ = $self; + $self->$code; + } + else { + $self; + } +} + sub to_html { my $self = shift; $self->zconfig->producer->html_from_stream($self->to_stream); @@ -135,6 +150,32 @@ sub then { $self->select($self->{transforms}->[-1]->selector); } +sub AUTOLOAD { + my ($self, $selector, @args) = @_; + my $sel = $self->select($selector); + my $meth = our $AUTOLOAD; + $meth =~ s/.*:://; + 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')"; + } +} + +sub DESTROY {} + 1; =head1 NAME @@ -172,13 +213,14 @@ HTML::Zoom - selector based streaming template engine $_->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('') + $_->replace_content('.name' => 'Epitaph') + ->replace_content('.age' => '') }, ], { repeat_between => '.between' } @@ -298,17 +340,15 @@ 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} ) - ->then - ->add_attribute( type => $field->{type} ) - ->then - ->add_attribute( value => $field->{value} ) - + ->add_to_attribute( + input => { + name => $field->{name}, + type => $field->{type}, + value => $field->{value} + }) } } @fields ]); @@ -603,6 +643,12 @@ zoom instance with that as the source HTML to be transformed. Convenience method - slurps the contents of $file and calls from_html with it. +=head2 from_events + + my $zoom = HTML::Zoom->from_events($evt); + +Create a new Zoom object from collected events + =head2 to_stream my $stream = $zoom->to_stream; @@ -651,6 +697,14 @@ sugar, the following is entirely equivalent: my $z2 = $sub->($z1); +=head2 apply_if + + my $z2 = $z1->apply_if($cond, sub { + $_->select('div')->replace_content('I AM A DIV!') }) + }); + +->apply but will only run the tranform if $cond is true + =head2 to_html my $html = $zoom->to_html; @@ -696,11 +750,56 @@ 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. +=head1 AUTOLOAD METHODS + +L AUTOLOADS methods against L so that you can reduce a +certain amount of boilerplate typing. This allows you to replace: + + $z->select('div')->replace_content("Hello World"); + +With: + + $z->replace_content(div => "Hello World"); + +Besides saving a few keys per invocations, you may feel this looks neater +in your code and increases understanding. + +=head1 AUTHOR + +mst - Matt S. Trout (cpan:MSTROUT) + +=head1 CONTRIBUTORS + +Oliver Charles + +Jakub Nareski + +Simon Elliott + +Joe Highton + +John Napiorkowski + +Robert Buels + +David Dorward + +=head1 COPYRIGHT + +Copyright (c) 2010-2011 the HTML::Zoom L and L +as listed above. + +=head1 LICENSE + +This library is free software, you can redistribute it and/or modify +it under the same terms as Perl itself. + =cut +