/[webpac]/trunk2/lib/WebPAC.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 /trunk2/lib/WebPAC.pm

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

revision 355 by dpavlin, Wed Jun 16 11:41:50 2004 UTC revision 359 by dpavlin, Wed Jun 16 15:41:16 2004 UTC
# Line 4  use Carp; Line 4  use Carp;
4  use Text::Iconv;  use Text::Iconv;
5  use Config::IniFiles;  use Config::IniFiles;
6    
7    use Data::Dumper;
8    
9  =head1 NAME  =head1 NAME
10    
11  WebPAC - base class for WebPAC  WebPAC - base class for WebPAC
# Line 129  sub open_isis { Line 131  sub open_isis {
131    
132          my $maxmfn = OpenIsis::maxRowid( $isis_db ) || 1;          my $maxmfn = OpenIsis::maxRowid( $isis_db ) || 1;
133    
134            $maxmfn = $self->{limit_mfn} if ($self->{limit_mfn});
135    
136          # read database          # read database
137          for (my $mfn = 1; $mfn <= $maxmfn; $mfn++) {          for (my $mfn = 1; $mfn <= $maxmfn; $mfn++) {
138    
# Line 195  sub create_lookup { Line 199  sub create_lookup {
199          }          }
200  }  }
201    
202    =head2 get_data
203    
204    Returns value from record.
205    
206     $self->get_data(\$rec,$f,$sf,$i,\$found);
207    
208    Arguments are:
209    record reference C<$rec>,
210    field C<$f>,
211    optional subfiled C<$sf>,
212    index for repeatable values C<$i>.
213    
214    Optinal variable C<$found> will be incremeted if thre
215    is field.
216    
217    Returns value or empty string.
218    
219    =cut
220    
221    sub get_data {
222            my $self = shift;
223    
224            my ($rec,$f,$sf,$i,$found) = @_;
225            if ($$rec->{$f}) {
226                    if ($sf && $$rec->{$f}->[$i]->{$sf}) {
227                            $$found++ if (defined($$found));
228                            return $$rec->{$f}->[$i]->{$sf};
229                    } elsif ($$rec->{$f}->[$i]) {
230                            $$found++ if (defined($$found));
231                            return $$rec->{$f}->[$i];
232                    }
233            } else {
234                    return '';
235            }
236    }
237    
238  =head2 fill_in  =head2 fill_in
239    
240  Workhourse of all: takes record from in-memory structure of database and  Workhourse of all: takes record from in-memory structure of database and
# Line 228  sub fill_in { Line 268  sub fill_in {
268    
269          my $found = 0;          my $found = 0;
270    
271          # get field with subfield          my $eval_code;
272          sub get_sf {          # remove eval{...} from beginning
273                  my ($found,$rec,$f,$sf,$i) = @_;          $eval_code = $1 if ($format =~ s/^eval{([^}]+)}//s);
                 if ($$rec->{$f} && $$rec->{$f}->[$i]->{$sf}) {  
                         $$found++;  
                         return $$rec->{$f}->[$i]->{$sf};  
                 } else {  
                         return '';  
                 }  
         }  
   
         # get field (without subfield)  
         sub get_nosf {  
                 my ($found,$rec,$f,$i) = @_;  
                 if ($$rec->{$f} && $$rec->{$f}->[$i]) {  
                         $$found++;  
                         return $$rec->{$f}->[$i];  
                 } else {  
                         return '';  
                 }  
         }  
274    
275          # do actual replacement of placeholders          # do actual replacement of placeholders
276          $format =~ s/v(\d+)\^(\w)/get_sf(\$found,\$rec,$1,$2,$i)/ges;          $format =~ s/v(\d+)(?:\^(\w))*/$self->get_data(\$rec,$1,$2,$i,\$found)/ges;
         $format =~ s/v(\d+)/get_nosf(\$found,\$rec,$1,$i)/ges;  
277    
278          if ($found) {          if ($found) {
279                    if ($eval_code) {
280                            my $eval = $self->fill_in($rec,$eval_code,$i);
281                            return if (! eval $eval);
282                    }
283                  # do we have lookups?                  # do we have lookups?
284                  if ($format =~ /\[[^\[\]]+\]/o) {                  if ($format =~ /\[[^\[\]]+\]/o) {
285                          return $self->lookup($format);                          return $self->lookup($format);
# Line 310  sub lookup { Line 335  sub lookup {
335          }          }
336  }  }
337    
338    =head2 parse
339    
340    Perform smart parsing of string, skipping delimiters for fields which aren't
341    defined. It can also eval code in format starting with C<eval{...}> and
342    return output or nothing depending on eval code.
343    
344     $webpac->parse($rec,'eval{"v901^a" eq "Deskriptor"}descriptor: v250^a', $i);
345    
346    =cut
347    
348    sub parse {
349            my $self = shift;
350    
351            my ($rec, $format, $i) = @_;
352    
353            confess("need HASH as first argument!") if ($rec !~ /HASH/o);
354    
355            $i = 0 if (! $i);
356    
357            my @out;
358    
359            my $eval_code;
360            # remove eval{...} from beginning
361            $eval_code = $1 if ($format =~ s/^eval{([^}]+)}//s);
362    
363            my $prefix;
364            my $all_found=0;
365    
366    #print "## $format\n";
367            while ($format =~ s/^(.*?)v(\d+)(?:\^(\w))*//s) {
368    #print "## [ $1 | $2 | $3 ] $format\n";
369    
370                    my $del = $1 || '';
371                    $prefix ||= $del if ($all_found == 0);
372    
373                    my $found = 0;
374                    my $tmp = $self->get_data(\$rec,$2,$3,$i,\$found);
375    
376                    if ($found) {
377                            push @out, $del;
378                            push @out, $tmp;
379                            $all_found += $found;
380                    }
381            }
382    
383            return if (! $all_found);
384    
385            my $out = join('',@out) . $format;
386    
387            # add prefix if not there
388            $out = $prefix . $out if ($out !~ m/^\Q$prefix\E/);
389            
390            if ($eval_code) {
391                    my $eval = $self->fill_in($rec,$eval_code,$i);
392                    return if (! eval $eval);
393            }
394    
395            return $out;
396    }
397    
398  1;  1;

Legend:
Removed from v.355  
changed lines
  Added in v.359

  ViewVC Help
Powered by ViewVC 1.1.26