r11727@llin: dpavlin | 2005-12-16 19:41:08 +0100
[webpac2] / lib / WebPAC / Normalize.pm
index f65d82f..1a8f4ac 100644 (file)
@@ -11,11 +11,11 @@ WebPAC::Normalize - data mungling for normalisation
 
 =head1 VERSION
 
-Version 0.05
+Version 0.06
 
 =cut
 
-our $VERSION = '0.05';
+our $VERSION = '0.06';
 
 =head1 SYNOPSIS
 
@@ -47,6 +47,10 @@ optional C<filter{filter_name}> at B<begining of format> will apply perl
 code defined as code ref on format after field substitution to producing
 output
 
+There is one built-in filter called C<regex> which can be use like this:
+
+  filter{regex(s/foo/bar/)}
+
 =item *
 
 optional C<lookup{...}> will be then performed. See C<WebPAC::Lookups>.
@@ -119,6 +123,15 @@ sub new {
 
        $log->debug("using lookup regex: ", $self->{lookup_regex}) if ($r && $l);
 
+       if ($self->{filter} && ! $self->{filter}->{regex}) {
+               $log->debug("adding built-in filter regex");
+               $self->{filter}->{regex} = sub {
+                       my ($val, $regex) = @_;
+                       eval "\$val =~ $regex";
+                       return $val;
+               };
+       }
+
        $self ? return $self : return undef;
 }
 
@@ -278,6 +291,14 @@ return output or nothing depending on eval code.
 
  my $text = $webpac->parse($rec,'eval{"v901^a" eq "Deskriptor"}descriptor: v250^a', $i);
 
+Filters are implemented here. While simple form of filters looks like this:
+
+  filter{name_of_filter}
+
+but, filters can also have variable number of parametars like this:
+
+  filter{name_of_filter(param,param,param)}
+
 =cut
 
 sub parse {
@@ -349,11 +370,20 @@ sub parse {
                return if (! $self->_eval($eval));
        }
        
-       if ($filter_name && $self->{'filter'}->{$filter_name}) {
-               $log->debug("about to filter{$filter_name} format: $out");
-               $out = $self->{'filter'}->{$filter_name}->($out);
-               return unless(defined($out));
-               $log->debug("filter result: $out");
+       if ($filter_name) {
+               my @filter_args;
+               if ($filter_name =~ s/(\w+)\((.*)\)/$1/) {
+                       @filter_args = split(/,/, $2);
+               }
+               if ($self->{'filter'}->{$filter_name}) {
+                       $log->debug("about to filter{$filter_name} format: $out with arguments: ", join(",", @filter_args));
+                       unshift @filter_args, $out;
+                       $out = $self->{'filter'}->{$filter_name}->(@filter_args);
+                       return unless(defined($out));
+                       $log->debug("filter result: $out");
+               } else {
+                       $log->warn("trying to use undefined filter $filter_name");
+               }
        }
 
        return $out;