--- trunk/lib/WebPAC/Normalize.pm 2006/01/08 21:50:34 372 +++ trunk/lib/WebPAC/Normalize.pm 2006/04/30 12:17:19 436 @@ -13,11 +13,11 @@ =head1 VERSION -Version 0.08 +Version 0.09 =cut -our $VERSION = '0.08'; +our $VERSION = '0.09'; =head1 SYNOPSIS @@ -137,6 +137,37 @@ $self ? return $self : return undef; } +=head2 all_tags + +Returns all tags in document in specified order + + my $sorted_tags = $self->all_tags(); + +=cut + +sub all_tags { + my $self = shift; + + if (! $self->{_tags_by_order}) { + + my $log = $self->_get_logger; + # sanity check + $log->logdie("can't find self->{inport_xml}->{indexer}") unless ($self->{import_xml}->{indexer}); + + my @tags = keys %{ $self->{'import_xml'}->{'indexer'}}; + $log->debug("unsorted tags: " . join(", ", @tags)); + + @tags = sort { $self->_sort_by_order } @tags; + + $log->debug("sorted tags: " . join(",", @tags) ); + + $self->{_tags_by_order} = \@tags; + } + + return $self->{_tags_by_order}; +} + + =head2 data_structure @@ -172,19 +203,13 @@ $log->debug("cache miss, creating"); } - my @sorted_tags; - if ($self->{tags_by_order}) { - @sorted_tags = @{$self->{tags_by_order}}; - } else { - @sorted_tags = sort { $self->_sort_by_order } keys %{$self->{'import_xml'}->{'indexer'}}; - $self->{tags_by_order} = \@sorted_tags; - } + my $tags = $self->all_tags(); - my $ds; + $log->debug("tags: ",sub { join(", ",@{ $tags }) }); - $log->debug("tags: ",sub { join(", ",@sorted_tags) }); + my $ds; - foreach my $field (@sorted_tags) { + foreach my $field (@{ $tags }) { my $row; @@ -204,7 +229,7 @@ } if (! @v) { $log->debug("$field <",$self->{tag},"> format: $format no values"); -# next; + next; } else { $log->debug("$field <",$self->{tag},"> format: $format values: ", join(",", @v)); } @@ -364,7 +389,7 @@ # we will skip delimiter before first occurence of field! push @out, $del unless($found_any->{$fld_type} == 1); - push @out, $tmp; + push @out, $tmp if ($tmp); } $f_step++; } @@ -471,15 +496,20 @@ # remove filter{...} from beginning $filter_name = $1 if ($format =~ s/^filter{([^}]+)}//s); - # do actual replacement of placeholders - # repeatable fields - if ($format =~ s/v(\d+)(?:\^(\w))?/$self->get_data(\$rec,$1,$2,$i,\$found,$rec_size)/ges) { - $just_single = 0; - } + { + # fix warnings + no warnings 'uninitialized'; + + # do actual replacement of placeholders + # repeatable fields + if ($format =~ s/v(\d+)(?:\^(\w))?/$self->get_data(\$rec,$1,$2,$i,\$found,$rec_size)/ges) { + $just_single = 0; + } - # non-repeatable fields - if ($format =~ s/s(\d+)(?:\^(\w))?/$self->get_data(\$rec,$1,$2,0,\$found,$rec_size)/ges) { - return if ($i > 0 && $just_single); + # non-repeatable fields + if ($format =~ s/s(\d+)(?:\^(\w))?/$self->get_data(\$rec,$1,$2,0,\$found,$rec_size)/ges) { + return if ($i > 0 && $just_single); + } } if ($found) { @@ -532,21 +562,27 @@ $log->logconfess("need HASH as first argument!") if ($rec !~ /HASH/o); return if (! $format_utf8); + $log->debug("using $code on $format_utf8"); + my $i = 0; my $max = 0; my @arr; my $rec_size = {}; while ($i <= $max) { - my $v = $self->$code($rec,$format_utf8,$i++,\$rec_size) || next; - push @arr, $v; + my @v = $self->$code($rec,$format_utf8,$i++,\$rec_size); if ($rec_size) { foreach my $f (keys %{ $rec_size }) { $max = $rec_size->{$f} if ($rec_size->{$f} > $max); } - warn "max set to $max, rec_size = ", Dumper($rec_size); + $log->debug("max set to $max"); undef $rec_size; } + if (@v) { + push @arr, @v; + } else { + push @arr, '' if ($max > $i); + } } $log->debug("format '$format_utf8' returned ",--$i," elements: ", sub { join(" | ",@arr) }) if (@arr); @@ -622,7 +658,8 @@ if ($$rec->{$f}->[$i] =~ /HASH/o) { my $out; foreach my $k (keys %{$$rec->{$f}->[$i]}) { - $out .= '$' . $k .':' . $$rec->{$f}->[$i]->{$k}." "; + my $v = $$rec->{$f}->[$i]->{$k}; + $out .= '$' . $k .':' . $v if ($v); } return $out; } else {