--- trunk/lib/WebPAC/Normalize.pm 2007/11/12 11:17:19 1037 +++ trunk/lib/WebPAC/Normalize.pm 2009/05/29 20:32:13 1205 @@ -7,6 +7,7 @@ _debug _pack_subfields_hash + to search_display search display sorted rec1 rec2 rec @@ -46,13 +47,15 @@ marc_template /); +use Storable qw/dclone/; + =head1 NAME WebPAC::Normalize - describe normalisaton rules using sets =cut -our $VERSION = '0.35'; +our $VERSION = '0.36'; =head1 SYNOPSIS @@ -147,6 +150,12 @@ sub _get_rec { $rec }; +sub rec_array { + my $d = $rec->{ $_[0] }; + return @$d if ref($d) eq 'ARRAY'; + die "field $_[0] not array: ",dump( $d ); +} + =head2 _set_config Set current config hash @@ -263,20 +272,36 @@ warn "debug level $l",$/ if ($l > 0); $debug = $l; $WebPAC::Normalize::MARC::debug = $debug; -warn "#### MARC::debug = ",dump($WebPAC::Normalize::MARC::debug); } =head1 Functions to create C Those functions generally have to first in your normalization file. +=head2 to + +Generic way to set values for some name + + to('field-name', 'name-value' => rec('200','a') ); + +There are many helpers defined below which might be easier to use. + +=cut + +sub to { + my $type = shift or confess "need type -- BUG?"; + my $name = shift or confess "needs name as first argument"; + my @o = grep { defined($_) && $_ ne '' } @_; + return unless (@o); + $out->{$name}->{$type} = \@o; +} + =head2 search_display Define output for L and L at the same time search_display('Title', rec('200','a') ); - =cut sub search_display { @@ -289,7 +314,7 @@ =head2 tag -Old name for L, but supported +Old name for L, it will probably be removed at one point. =cut @@ -305,15 +330,7 @@ =cut -sub _field { - my $type = shift or confess "need type -- BUG?"; - my $name = shift or confess "needs name as first argument"; - my @o = grep { defined($_) && $_ ne '' } @_; - return unless (@o); - $out->{$name}->{$type} = \@o; -} - -sub display { _field( 'display', @_ ) } +sub display { to( 'display', @_ ) } =head2 search @@ -323,7 +340,7 @@ =cut -sub search { _field( 'search', @_ ) } +sub search { to( 'search', @_ ) } =head2 sorted @@ -333,8 +350,23 @@ =cut -sub sorted { _field( 'sorted', @_ ) } +sub sorted { to( 'sorted', @_ ) } +=head2 row + +Insert new row of data into output module + + row( column => 'foo', column2 => 'bar' ); + +=cut + +use Data::Dump qw/dump/; + +sub row { + die "array doesn't have even number of elements but $#_: ",dump( @_ ) if $#_ % 2 != 1; + + push @{ $out->{'_rows'} }, {@_}; +} =head1 Functions to extract data from input @@ -356,10 +388,12 @@ warn "## _pack_subfields_hash( ",dump(@_), " )\n" if ($debug > 1); - my ($h,$include_subfields) = @_; + my ($hash,$include_subfields) = @_; # sanity and ease of use - return $h if (ref($h) ne 'HASH'); + return $hash if (ref($hash) ne 'HASH'); + + my $h = dclone( $hash ); if ( defined($h->{subfields}) ) { my $sfs = delete $h->{subfields} || die "no subfields?"; @@ -450,7 +484,7 @@ } else { $_->{$sf}; } - } grep { ref($_) eq 'HASH' && $_->{$sf} } @{ $rec->{$f} }; + } grep { ref($_) eq 'HASH' && defined $_->{$sf} } @{ $rec->{$f} }; } =head2 rec