Changeset 2366

Show
Ignore:
Timestamp:
10/04/07 16:13:40
Author:
miyagawa
Message:

add an experimental filter support!

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • Web-Scraper/trunk/Makefile.PL

    r2364 r2366  
    1212requires 'HTML::Entities'; 
    1313requires 'HTML::Tagset'; 
     14requires 'UNIVERSAL::require'; 
    1415requires 'URI'; 
    1516requires 'YAML'; 
  • Web-Scraper/trunk/lib/Web/Scraper.pm

    r2364 r2366  
    99use HTML::TreeBuilder::XPath; 
    1010use HTML::Selector::XPath; 
     11use UNIVERSAL::require; 
    1112 
    1213our $VERSION = '0.21'; 
     
    185186        } 
    186187        return $values; 
     188    } elsif (ref($val) eq 'ARRAY') { 
     189        my $how = shift @$val; 
     190        my $value = __get_value($node, $how, $uri); 
     191        for my $filter (@$val) { 
     192            $value = run_filter($value, $filter); 
     193        } 
     194        return $value; 
    187195    } else { 
    188196        Carp::croak "Unknown value type $val"; 
    189197    } 
     198} 
     199 
     200sub run_filter { 
     201    my($value, $filter) = @_; 
     202 
     203    ## sub { s/foo/bar/g } is a valid filter 
     204    ## sub { DateTime::Format::Foo->parse_string(shift) } is valid too 
     205    my $callback; 
     206    my $module; 
     207 
     208    if (ref($filter) eq 'CODE') { 
     209        $callback = $filter; 
     210        $module   = "$filter"; 
     211    } elsif (!ref($filter)) { 
     212        $module = $filter =~ s/^\+// ? $filter : "Web::Scraper::Filter::$filter"; 
     213        unless ($module->isa('Web::Scraper::Filter')) { 
     214            $module->require or Carp::croak("Loading $module: $@"); 
     215        } 
     216 
     217        $callback = sub { $module->new->filter(shift) }; 
     218    } else { 
     219        Carp::croak("Don't know filter type $filter"); 
     220    } 
     221 
     222    local $_ = $value; 
     223    my $retval = eval { $callback->($value) }; 
     224    if ($@) { 
     225        Carp::croak("Filter $module had an error: $@"); 
     226    } 
     227 
     228    no warnings 'uninitialized'; 
     229    if ($retval =~ /^\d+$/ && $_ ne $value) { 
     230        $value = $_; 
     231    } else { 
     232        $value = $retval; 
     233    } 
     234 
     235    return $value; 
    190236} 
    191237