/[webpac2]/trunk/lib/WebPAC/Parser.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/Parser.pm

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

revision 724 by dpavlin, Fri Sep 29 18:55:31 2006 UTC revision 755 by dpavlin, Sun Oct 8 20:28:17 2006 UTC
# Line 13  use base qw/WebPAC::Common/; Line 13  use base qw/WebPAC::Common/;
13    
14  =head1 NAME  =head1 NAME
15    
16  WebPAC::Parser - parse perl normalization configuration files and mungle it  WebPAC::Parser - parse perl normalization configuration files (rules) and mungle it
17    
18  =head1 VERSION  =head1 VERSION
19    
20  Version 0.06  Version 0.08
21    
22  =cut  =cut
23    
24  our $VERSION = '0.06';  our $VERSION = '0.08';
25    
26  =head1 SYNOPSIS  =head1 SYNOPSIS
27    
28  This module will parse L<WebPAC::Normalize/lookup> directives and generate source  This module will parse L<WebPAC::Normalize/lookup> directives and generate source
29  to produce lookups and normalization.  to produce lookups and normalization. It will also parse other parts of
30    source to produce some of DWIM (I<Do What I Mean>) magic
31    (like producing MARC oputput using L<WebPAC::Output::MARC> if there are C<marc_*>
32    rules in normalisation).
33    
34  It's written using L<PPI>, pure-perl parser for perl and heavily influenced by  It's written using L<PPI>, pure-perl parser for perl and heavily influenced by
35  reading about LISP. It might be a bit over-the board, but at least it removed  reading about LISP. It might be a bit over-the board, but at least it removed
# Line 165  sub normalize_rules { Line 168  sub normalize_rules {
168          return $self->{_normalize_source}->{ _q($database) }->{ _q($input) };          return $self->{_normalize_source}->{ _q($database) }->{ _q($input) };
169  }  }
170    
171    
172    =head2 have_rules
173    
174      my $do_marc = $parser->have_rules('marc', $database, $input);
175      my $do_index = $parser->have_rules('search', $database);
176    
177    This function will return hash containing count of all found C<marc_*> or
178    C<search> directives. Input name is optional.
179    
180    =cut
181    
182    sub have_rules {
183            my $self = shift;
184    
185            my $log = $self->_get_logger();
186            my $type = shift @_ || $log->logconfess("need at least type");
187            my $database = shift @_ || $log->logconfess("database is required");
188            my $input = shift @_;
189    
190            $input = _input_name($input);
191    
192    
193            return unless defined( $self->{_have_rules}->{ _q($database) } );
194    
195            my $database_rules = $self->{_have_rules}->{ _q($database ) };
196    
197            if (defined($input)) {
198    
199                    return unless (
200                            defined( $database_rules->{ _q($input) } ) &&
201                            defined( $database_rules->{ _q($input) }->{ $type } )
202                    );
203    
204                    return $database_rules->{ _q($input) }->{ $type };
205            }
206    
207            my $usage;
208    
209            foreach my $i (keys %{ $database_rules }) {
210                    next unless defined( $database_rules->{$i}->{$type} );
211    
212                    foreach my $t (keys %{ $database_rules->{ $i }->{$type} }) {
213                            $usage->{ $t } += $database_rules->{ $i }->{ $t };
214                    }
215            }
216    
217            return $usage;
218    
219    }
220    
221    
222  =head1 PRIVATE  =head1 PRIVATE
223    
224  =head2 _read_sources  =head2 _read_sources
# Line 182  sub _read_sources { Line 236  sub _read_sources {
236    
237          my $nr = 0;          my $nr = 0;
238    
239          my @lookups;          my @sources;
240    
241          $self->{config}->iterate_inputs( sub {          $self->{config}->iterate_inputs( sub {
242                  my ($input, $database) = @_;                  my ($input, $database) = @_;
# Line 205  sub _read_sources { Line 259  sub _read_sources {
259    
260                          $self->{valid_inputs}->{$database}->{$input_name}++;                          $self->{valid_inputs}->{$database}->{$input_name}++;
261    
262                          push @lookups, sub {                          push @sources, sub {
263                                  $self->_parse_lookups( $database, $input_name, $full, $s );                                  $self->_parse_source( $database, $input_name, $full, $s );
264                          };                          };
265    
266                          $nr++;                          $nr++;
# Line 215  sub _read_sources { Line 269  sub _read_sources {
269    
270          $log->debug("found $nr source files");          $log->debug("found $nr source files");
271    
272          # parse all lookups          # parse all sources
273          $_->() foreach (@lookups);          $_->() foreach (@sources);
274    
275          return $nr;          return $nr;
276  }  }
277    
278  =head2 _parse_lookups  =head2 _parse_source
279    
280    $parser->_parse_lookups($database,$input,$path,$source);    $parser->_parse_source($database,$input,$path,$source);
281    
282  Called for each normalize source (rules) in each input by L</_read_sources>  Called for each normalize source (rules) in each input by L</_read_sources>
283    
# Line 231  It will report invalid databases and inp Line 285  It will report invalid databases and inp
285    
286  =cut  =cut
287    
288  sub _parse_lookups {  sub _parse_source {
289          my $self = shift;          my $self = shift;
290          my ($database, $input, $path, $source) = @_;          my ($database, $input, $path, $source) = @_;
291    
# Line 362  sub _parse_lookups { Line 416  sub _parse_lookups {
416    
417          $log->error("Parser errors:\n", join("\n",@{ $self->{_lookup_errors} }) ) if ($self->{_lookup_errors});          $log->error("Parser errors:\n", join("\n",@{ $self->{_lookup_errors} }) ) if ($self->{_lookup_errors});
418    
419            $Document->find( sub {
420                            my ($Document,$Element) = @_;
421    
422                            $Element->isa('PPI::Token::Word') or return '';
423                            if ($Element->content =~ m/^(marc|search)/) {
424                                    my $what = $1;
425                                    $log->debug("found $what rules in $database/$input");
426                                    $self->{_have_rules}->{ $database }->{ $input }->{ $what }->{ $Element->content }++;
427                            } else {
428                                    return '';
429                            }
430            });
431    
432          return 1;          return 1;
433  }  }
434    

Legend:
Removed from v.724  
changed lines
  Added in v.755

  ViewVC Help
Powered by ViewVC 1.1.26