--- trunk2/lib/WebPAC.pm 2004/06/16 11:41:50 355 +++ trunk2/lib/WebPAC.pm 2004/06/16 13:41:54 356 @@ -195,6 +195,42 @@ } } +=head2 get_data + +Returns value from record. + + $self->get_data(\$rec,$f,$sf,$i,\$found); + +Arguments are: +record reference C<$rec>, +field C<$f>, +optional subfiled C<$sf>, +index for repeatable values C<$i>. + +Optinal variable C<$found> will be incremeted if thre +is field. + +Returns value or empty string. + +=cut + +sub get_data { + my $self = shift; + + my ($rec,$f,$sf,$i,$found) = @_; + if ($$rec->{$f}) { + if ($sf && $$rec->{$f}->[$i]->{$sf}) { + $$found++ if (defined($$found)); + return $$rec->{$f}->[$i]->{$sf}; + } elsif ($$rec->{$f}->[$i]) { + $$found++ if (defined($$found)); + return $$rec->{$f}->[$i]; + } + } else { + return ''; + } +} + =head2 fill_in Workhourse of all: takes record from in-memory structure of database and @@ -228,31 +264,8 @@ my $found = 0; - # get field with subfield - sub get_sf { - my ($found,$rec,$f,$sf,$i) = @_; - 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 ''; - } - } - # do actual replacement of placeholders - $format =~ s/v(\d+)\^(\w)/get_sf(\$found,\$rec,$1,$2,$i)/ges; - $format =~ s/v(\d+)/get_nosf(\$found,\$rec,$1,$i)/ges; + $format =~ s/v(\d+)(?:\^(\w))*/$self->get_data(\$rec,$1,$2,$i,\$found)/ges; if ($found) { # do we have lookups? @@ -310,4 +323,46 @@ } } +=head2 parse + +Perform smart parsing of string, skipping delimiters for fields which aren't +defined. It can also eval code in format starting with C and +return output or nothing depending on eval code. + + $webpac->parse($rec,'eval{"v901^a" eq "Deskriptor"}descriptor: v250^a', $i); + +=cut + +sub parse { + my $self = shift; + + my ($rec, $format, $i) = @_; + + my @out; + + my $eval_code; + # remove eval{...} from beginning + $eval_code = $1 if ($format =~ s/^eval{([^}]+)}//s); + + my $prefix = ''; + $prefix = $1 if ($format =~ s/^(.+)(v\d+(?:\^\w)*)/$2/s); + + sub f_sf_del { + my ($self,$rec,$out,$f,$sf,$del,$i) = @_; + + my $found=0; + my $tmp = $self->get_data($rec,$f,$sf,$i,\$found); + if ($found) { + push @{$$out}, $tmp; + push @{$$out}, $del; + } + return ''; + } + + #$format =~ s/(.*)v(\d+)(?:\^(\w))*/f_sf_del($self,\$rec,\@out,$2,$3,$1,$i/ges; + + print Dumper(@out); + +} + 1;