/[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 698 by dpavlin, Mon Sep 25 11:14:53 2006 UTC revision 724 by dpavlin, Fri Sep 29 18:55:31 2006 UTC
# Line 9  use PPI::Dumper; Line 9  use PPI::Dumper;
9  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
10  use File::Slurp;  use File::Slurp;
11    
12  use base qw/WebPAC::Common WebPAC::Normalize/;  use base qw/WebPAC::Common/;
13    
14  =head1 NAME  =head1 NAME
15    
# Line 17  WebPAC::Parser - parse perl normalizatio Line 17  WebPAC::Parser - parse perl normalizatio
17    
18  =head1 VERSION  =head1 VERSION
19    
20  Version 0.04  Version 0.06
21    
22  =cut  =cut
23    
24  our $VERSION = '0.04';  our $VERSION = '0.06';
25    
26  =head1 SYNOPSIS  =head1 SYNOPSIS
27    
# Line 61  sub new { Line 61  sub new {
61    
62          $log->logdie("can't iterate_inputs over this config object") unless ($self->{config}->can('iterate_inputs'));          $log->logdie("can't iterate_inputs over this config object") unless ($self->{config}->can('iterate_inputs'));
63    
64          $self->read_sources;          $self->_read_sources;
   
         $self->{config}->iterate_inputs( sub {  
                 my ($input, $database) = @_;  
                 return unless $self->valid_database_input($database, _input_name($input));  
                 $self->parse_lookups($database, _input_name($input));  
         } );  
65    
66          $self ? return $self : return undef;          $self ? return $self : return undef;
67  }  }
68    
69  =head2 read_sources  =head2 valid_database
70    
71      my $ok = $parse->valid_database('key');
72    
73    my $source_files = $parser->read_sources;  =cut
74    
75  Called by L</new>.  sub valid_database {
76            my $self = shift;
77    
78            my $database = shift || return;
79    
80            return defined($self->{valid_inputs}->{ _q($database) });
81    }
82    
83    =head2 valid_database_input
84    
85      my $ok = $parse->valid_database('database_key','input_name');
86    
87  =cut  =cut
88    
89  sub _input_name($);  sub valid_database_input {
90            my $self = shift;
91            my ($database,$input) = @_;
92            $input = _input_name($input);
93            return defined($self->{valid_inputs}->{ _q($database) }->{ _q($input) });
94    }
95    
96    =head2 depends
97    
98    Return all databases and inputs on which specified one depends
99    
100      $depends_on = $parser->depends('database','input');
101    
102    =cut
103    
104    sub depends {
105            my $self = shift;
106            my ($database,$input) = @_;
107            $input = _input_name($input);
108            $self->_get_logger->debug("depends($database,$input)");
109            return unless (
110                    defined( $self->{depends}->{ _q($database) } ) &&
111                    defined( $self->{depends}->{ _q($database) }->{ _q($input) } )
112            );
113            return $self->{depends}->{ _q($database) }->{ _q($input) };
114    }
115    
116    =head2 have_lookup_create
117    
118      my @keys = $parser->have_lookup_create($database, $input);
119    
120    =cut
121    
122    sub have_lookup_create {
123            my $self = shift;
124            my ($database,$input) = @_;
125            $input = _input_name($input);
126            return unless (
127                    defined( $self->{_lookup_create_key}->{ _q($database) } ) &&
128                    defined( $self->{_lookup_create_key}->{ _q($database) }->{ _q($input) } )
129            );
130            return keys %{ $self->{_lookup_create_key}->{ _q($database) }->{ _q($input) } };
131    }
132    
133    
134    =head2 lookup_create_rules
135    
136      my $source = $parser->lookup_create_rules($database, $input);
137    
138    =cut
139    
140    sub lookup_create_rules {
141            my $self = shift;
142            my ($database,$input) = @_;
143            $input = _input_name($input);
144            return unless (
145                    defined( $self->{_lookup_create}->{ _q($database) } ) &&
146                    defined( $self->{_lookup_create}->{ _q($database) }->{ _q($input) } )
147            );
148            return $self->{_lookup_create}->{ _q($database) }->{ _q($input) };
149    }
150    
151    =head2 normalize_rules
152    
153      my $source = $parser->normalize_rules($database, $input);
154    
155    =cut
156    
157    sub normalize_rules {
158            my $self = shift;
159            my ($database,$input) = @_;
160            $input = _input_name($input);
161            return unless (
162                    defined( $self->{_normalize_source}->{ _q($database) } ) &&
163                    defined( $self->{_normalize_source}->{ _q($database) }->{ _q($input) } )
164            );
165            return $self->{_normalize_source}->{ _q($database) }->{ _q($input) };
166    }
167    
168    =head1 PRIVATE
169    
170    =head2 _read_sources
171    
172      my $source_files = $parser->_read_sources;
173    
174    Called by L</new>.
175    
176  sub read_sources {  =cut
177    
178    sub _read_sources {
179          my $self = shift;          my $self = shift;
180    
181          my $log = $self->_get_logger();          my $log = $self->_get_logger();
182    
183          my $nr = 0;          my $nr = 0;
184    
185            my @lookups;
186    
187          $self->{config}->iterate_inputs( sub {          $self->{config}->iterate_inputs( sub {
188                  my ($input, $database) = @_;                  my ($input, $database) = @_;
189    
190                  my @normalize;                  $log->debug("database: $database input = ", dump($input));
   
                 if (ref($input->{normalize}) eq 'ARRAY') {  
                         @normalize = @{ $input->{normalize} };  
                 } else {  
                         @normalize = ( $input->{normalize} );  
                 }  
191    
192                  foreach my $normalize (@normalize) {                  foreach my $normalize (@{ $input->{normalize} }) {
193    
194                          my $path = $normalize->{path};                          my $path = $normalize->{path};
195                          return unless($path);                          return unless($path);
# Line 114  sub read_sources { Line 203  sub read_sources {
203    
204                          $log->debug("$database/$input_name: adding $path");                          $log->debug("$database/$input_name: adding $path");
205    
206                          $self->{valid_inputs}->{$database}->{$input_name} = {                          $self->{valid_inputs}->{$database}->{$input_name}++;
                                 source => $s,  
                                 path => $full,  
                                 usage => 0,  
                         } unless defined($self->{valid_inputs}->{$database}->{$input_name});  
207    
208                          $self->{valid_inputs}->{$database}->{$input_name}->{usage}++;                          push @lookups, sub {
209                                    $self->_parse_lookups( $database, $input_name, $full, $s );
210                            };
211    
212                          $nr++;                          $nr++;
213                  }                  }
# Line 128  sub read_sources { Line 215  sub read_sources {
215    
216          $log->debug("found $nr source files");          $log->debug("found $nr source files");
217    
218            # parse all lookups
219            $_->() foreach (@lookups);
220    
221          return $nr;          return $nr;
222  }  }
223    
224  =head2 parse_lookups  =head2 _parse_lookups
225    
226    $parser->parse_lookups($database,$input);    $parser->_parse_lookups($database,$input,$path,$source);
227    
228  Called for each input by L</new>  Called for each normalize source (rules) in each input by L</_read_sources>
229    
230  It will report invalid databases and inputs in error log after parsing.  It will report invalid databases and inputs in error log after parsing.
231    
232  =cut  =cut
233    
234  sub parse_lookups {  sub _parse_lookups {
235          my $self = shift;          my $self = shift;
236          my ($database, $input) = @_;          my ($database, $input, $path, $source) = @_;
237    
238          $input = _input_name($input);          $input = _input_name($input);
239    
# Line 152  sub parse_lookups { Line 242  sub parse_lookups {
242          $log->logdie("invalid database $database" ) unless $self->valid_database( $database );          $log->logdie("invalid database $database" ) unless $self->valid_database( $database );
243          $log->logdie("invalid input $input of database $database", ) unless $self->valid_database_input( $database, $input );          $log->logdie("invalid input $input of database $database", ) unless $self->valid_database_input( $database, $input );
244    
         my $source = $self->{valid_inputs}->{$database}->{$input}->{source};  
         my $path = $self->{valid_inputs}->{$database}->{$input}->{path};  
   
245          $log->logdie("no source found for database $database input $input path $path") unless ($source);          $log->logdie("no source found for database $database input $input path $path") unless ($source);
246    
247          $log->info("parsing lookups for $database/$input from $path");          $log->info("parsing lookups for $database/$input from $path (",length($source)," bytes)");
248    
249          my $Document = PPI::Document->new( \$source ) || $log->logdie("can't parse source:\n", $self->{source});          my $Document = PPI::Document->new( \$source ) || $log->logdie("can't parse source:\n", $self->{source});
250    
251          $Document->prune('PPI::Token::Whitespace');          $Document->prune('PPI::Token::Whitespace');
252            $Document->prune('PPI::Token::Comment');
253          #$Document->prune('PPI::Token::Operator');          #$Document->prune('PPI::Token::Operator');
254    
255          # Find all the named subroutines          # Find all the named subroutines
# Line 226  sub parse_lookups { Line 314  sub parse_lookups {
314    
315                          $log->debug("key = $key");                          $log->debug("key = $key");
316    
                         my $create = '  
                                 $coderef = ' . $e[7] . $e[8] . ';  
                                 foreach my $v ($coderef->()) {  
                                         next unless (defined($v) && $v ne \'\');  
                                         push @{ $lookup->{\'' . $key . '\'}->{$v} }, $mfn;  
                                 }  
                         ';  
   
                         $log->debug("create: $create");  
   
317                          return $self->_lookup_error("invalid database $e[3] in $path" ) unless $self->valid_database( $e[3] );                          return $self->_lookup_error("invalid database $e[3] in $path" ) unless $self->valid_database( $e[3] );
318                          return $self->_lookup_error("invalid input $e[5] of database $e[3] in $path", ) unless $self->valid_database_input( $e[3], $e[5] );                          return $self->_lookup_error("invalid input $e[5] of database $e[3] in $path", ) unless $self->valid_database_input( $e[3], $e[5] );
319    
320                            my $create = qq{
321                                    save_into_lookup($e[3],$e[5],'$key', $e[7] $e[8] );
322                            };
323    
324                            $log->debug("create: $create");
325    
326                          # save code to create this lookup                          # save code to create this lookup
327                          $self->{_lookup_create}->{ _q($e[3]) }->{ _q($e[5]) }->{ _q($key) } .= $create;                          $self->{_lookup_create}->{ _q($e[3]) }->{ _q($e[5]) } .= $create;
328                            $self->{_lookup_create_key}->{ _q($e[3]) }->{ _q($e[5]) }->{ _q($key) }++;
329    
330    
331                          if (defined( $self->{depends}->{ $database }->{ $input }->{ _q($e[3]) }->{ _q($e[5]) } )) {                          if (defined( $self->{depends}->{ $database }->{ $input }->{ _q($e[3]) }->{ _q($e[5]) }->{ $key } )) {
332                                  my $dep_key = $self->{depends}->{ $database }->{ $input }->{ _q($e[3]) }->{ _q($e[5]) };                                  $log->warn("dependency of $database/$input on $e[3]/$e[5] with $key allready recorded");
                                 $log->warn("dependency of $database/$input on $e[3]/$e[5] allready recorded as $dep_key, now changed to $key") if ($dep_key ne $key);  
333                          }                          }
334    
335                          # save this dependency                          # save this dependency
336                          $self->{depends}->{ $database }->{ $input }->{ _q($e[3]) }->{ _q($e[5]) } .= $key;                          $self->{depends}->{ $database }->{ $input }->{ _q($e[3]) }->{ _q($e[5]) }->{$key}++;
337    
338                          if ($#e < 10) {                          if ($#e < 10) {
339                                  $e[8]->insert_after( $e[8]->clone );                                  $e[8]->insert_after( $e[8]->clone );
# Line 269  sub parse_lookups { Line 353  sub parse_lookups {
353          $log->debug("create: ", dump($self->{_lookup_create}) );          $log->debug("create: ", dump($self->{_lookup_create}) );
354          $log->debug("normalize: $normalize_source");          $log->debug("normalize: $normalize_source");
355    
356          $self->{_normalize_source}->{$database}->{$input} = $normalize_source;          $self->{_normalize_source}->{$database}->{$input} .= $normalize_source;
357    
358          if ($self->{debug}) {          if ($self->{debug}) {
359                  my $Dumper = PPI::Dumper->new( $Document );                  my $Dumper = PPI::Dumper->new( $Document );
# Line 282  sub parse_lookups { Line 366  sub parse_lookups {
366  }  }
367    
368    
 =head2 lookup_create_rules  
   
   my $source = $parser->lookup_create_rules($database, $input);  
   
 =cut  
   
 sub lookup_create_rules {  
         my $self = shift;  
         my ($database,$input) = @_;  
         return $self->{_lookup_create}->{ _q($database) }->{ _q($input) };  
 }  
   
 =head2 valid_database  
   
   my $ok = $parse->valid_database('key');  
   
 =cut  
   
 sub valid_database {  
         my $self = shift;  
   
         my $database = shift || return;  
   
         return defined($self->{valid_inputs}->{ _q($database) });  
 }  
   
 =head2 valid_database_input  
   
   my $ok = $parse->valid_database('database_key','input_name');  
   
 =cut  
   
 sub valid_database_input {  
         my $self = shift;  
   
         my ($database,$input) = @_;  
         return defined($self->{valid_inputs}->{ _q($database) }->{ _q($input) });  
 }  
   
 =head2 depends  
   
 Return all databases and inputs on which specified one depends  
   
   $depends_on = $parser->depends('database','input');  
   
 =cut  
   
 sub depends {  
         my $self = shift;  
         my ($database,$input) = @_;  
         $self->_get_logger->debug("depends($database,$input)");  
         return unless defined( $self->{depends}->{ _q($database) }->{ _q($input) } );  
         return $self->{depends}->{ _q($database) }->{ _q($input) };  
 }  
   
 =head1 PRIVATE  
   
369  =head2 _q  =head2 _q
370    
371  Strip single or double quotes around value  Strip single or double quotes around value

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

  ViewVC Help
Powered by ViewVC 1.1.26