/[webpac2]/trunk/lib/WebPAC/Input.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/lib/WebPAC/Input.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 635 by dpavlin, Wed Sep 6 18:08:30 2006 UTC revision 636 by dpavlin, Wed Sep 6 19:25:22 2006 UTC
# Line 16  WebPAC::Input - read different file form Line 16  WebPAC::Input - read different file form
16    
17  =head1 VERSION  =head1 VERSION
18    
19  Version 0.11  Version 0.12
20    
21  =cut  =cut
22    
23  our $VERSION = '0.11';  our $VERSION = '0.12';
24    
25  =head1 SYNOPSIS  =head1 SYNOPSIS
26    
# Line 172  This function will read whole database i Line 172  This function will read whole database i
172                  900 => { '^a' => { ' : ' => '^b' } },                  900 => { '^a' => { ' : ' => '^b' } },
173                  901 => { '*' => { '^b' => ' ; ' } },                  901 => { '*' => { '^b' => ' ; ' } },
174          },          },
175            modify_file => 'conf/modify/mapping.map',
176   );   );
177    
178  By default, C<code_page> is assumed to be C<cp852>.  By default, C<code_page> is assumed to be C<cp852>.
# Line 189  C<modify_records> specify mapping from s Line 190  C<modify_records> specify mapping from s
190  delimiters to subfields, as well as oprations on fields (if subfield is  delimiters to subfields, as well as oprations on fields (if subfield is
191  defined as C<*>.  defined as C<*>.
192    
193    C<modify_file> is alternative for C<modify_records> above which preserves order and offers
194    (hopefully) simplier sintax than YAML or perl (see L</modify_file_regex>). This option
195    overrides C<modify_records> if both exists for same input.
196    
197  Returns size of database, regardless of C<offset> and C<limit>  Returns size of database, regardless of C<offset> and C<limit>
198  parametars, see also C<size>.  parametars, see also C<size>.
199    
# Line 235  sub open { Line 240  sub open {
240    
241          }          }
242    
243          my $rec_regex = $self->modify_record_regexps(%{ $arg->{modify_records} });          my $rec_regex;
244          $log->debug("rec_regex: ", Dumper($rec_regex));          if (my $p = $arg->{modify_file}) {
245                    $log->debug("using modify_file $p");
246                    $rec_regex = $self->modify_file_regexps( $p );
247            } elsif (my $h = $arg->{modify_records}) {
248                    $log->debug("using modify_records ", Dumper( $h ));
249                    $rec_regex = $self->modify_record_regexps(%{ $h });
250            }
251            $log->debug("rec_regex: ", Dumper($rec_regex)) if ($rec_regex);
252    
253          my ($db, $size) = $self->{open_db}->( $self,          my ($db, $size) = $self->{open_db}->( $self,
254                  path => $arg->{path},                  path => $arg->{path},
# Line 536  sub stats { Line 548  sub stats {
548    
549  =head2 modify_record_regexps  =head2 modify_record_regexps
550    
551  Generate hash with regexpes to be applied using L<filter>.  Generate hash with regexpes to be applied using l<filter>.
552    
553    my $regexpes = $input->modify_record_regexps(    my $regexpes = $input->modify_record_regexps(
554                  900 => { '^a' => { ' : ' => '^b' } },                  900 => { '^a' => { ' : ' => '^b' } },
# Line 545  Generate hash with regexpes to be applie Line 557  Generate hash with regexpes to be applie
557    
558  =cut  =cut
559    
560    sub _get_regex {
561            my ($sf,$from,$to) = @_;
562            if ($sf =~ /^\^/) {
563                    return
564                            's/\Q'. $sf .'\E([^\^]*?)\Q'. $from .'\E([^\^]*?)/'. $sf .'$1'. $to .'$2/';
565            } else {
566                    return
567                            's/\Q'. $from .'\E/'. $to .'/g';
568            }
569    }
570    
571  sub modify_record_regexps {  sub modify_record_regexps {
572          my $self = shift;          my $self = shift;
573          my $modify_record = {@_};          my $modify_record = {@_};
# Line 564  sub modify_record_regexps { Line 587  sub modify_record_regexps {
587                                  #die "no field?" unless defined($to);                                  #die "no field?" unless defined($to);
588                                  $log->debug("transform: |$from| -> |$to|");                                  $log->debug("transform: |$from| -> |$to|");
589    
590                                  if ($sf =~ /^\^/) {                                  my $regex = _get_regex($sf,$from,$to);
591                                          my $regex =                                  push @{ $regexpes->{$f} }, $regex;
592                                                  's/\Q'. $sf .'\E(.*?)\Q'. $from .'\E(.*?)/'. $sf .'$1'. $to .'$2/g';                                  $log->debug("regex: $regex");
                                         push @{ $regexpes->{$f} }, $regex;  
                                         $log->debug(">>>>> $regex [sf]");  
                                 } else {  
                                         my $regex =  
                                                 's/\Q'. $from .'\E/'. $to .'/g';  
                                         push @{ $regexpes->{$f} }, $regex;  
                                         $log->debug(">>>>> $regex [global]");  
                                 }  
   
593                          }                          }
594                  }                  }
595          }          }
596    
597            return $regexpes;
598    }
599    
600    =head2 modify_file_regexps
601    
602    Generate hash with regexpes to be applied using l<filter> from
603    pseudo hash/yaml format for regex mappings.
604    
605    It should be obvious:
606    
607            200
608              '^a'
609                ' : ' => '^e'
610                ' = ' => '^d'
611    
612    In field I<200> find C<'^a'> and then C<' : '>, and replace it with C<'^e'>.
613    In field I<200> find C<'^a'> and then C<' = '>, and replace it with C<'^d'>.
614    
615      my $regexpes = $input->modify_file_regexps( 'conf/modify/common.pl' );
616    
617    On undef path it will just return.
618    
619    =cut
620    
621    sub modify_file_regexps {
622            my $self = shift;
623    
624            my $modify_path = shift || return;
625    
626            my $log = $self->_get_logger();
627    
628            my $regexpes;
629    
630            CORE::open(my $fh, $modify_path) || $log->die("can't open modify file $modify_path: $!");
631    
632            my ($f,$sf);
633    
634            while(<$fh>) {
635                    chomp;
636                    next if (/^#/ || /^\s*$/);
637    
638                    if (/^\s*(\d+)\s*$/) {
639                            $f = $1;
640                            $log->debug("field: $f");
641                            next;
642                    } elsif (/^\s*'([^']*)'\s*$/) {
643                            $sf = $1;
644                            $log->die("can't define subfiled before field in: $_") unless ($f);
645                            $log->debug("subfield: $sf");
646                    } elsif (/^\s*'([^']*)'\s*=>\s*'([^']*)'\s*$/) {
647                            my ($from,$to) = ($1, $2);
648    
649                            $log->debug("transform: |$from| -> |$to|");
650    
651                            my $regex = _get_regex($sf,$from,$to);
652                            push @{ $regexpes->{$f} }, $regex;
653                            $log->debug("regex: $regex");
654                    }
655            }
656    
657          return $regexpes;          return $regexpes;
658  }  }
659    

Legend:
Removed from v.635  
changed lines
  Added in v.636

  ViewVC Help
Powered by ViewVC 1.1.26