--- trunk/all2xml.pl 2004/01/07 12:29:11 199 +++ trunk/all2xml.pl 2004/02/05 10:55:58 218 @@ -210,10 +210,23 @@ # placeholder for all repeatable entries for index + sub chk_eval($) { + my $data = shift; + if ($data =~ s/eval{([^}]+)}//) { + if (eval "$1") { + return $data; + } else { + return undef; + } + } else { + return $data; + } + } + sub mkformat($$) { my $x = shift || die "mkformat needs tag reference"; my $data = shift || return; - my $format_name = x($x->{format_name}) || return $data; + my $format_name = x($x->{format_name}) || return chk_eval($data); my $fmt = x($config->{format}->{$format_name}->{content}) || die " is not defined!"; my $format_delimiter = x($x->{format_delimiter}); my @data; @@ -226,10 +239,10 @@ if ($fmt) { my $nr = scalar $fmt =~ s/%s/%s/g; if (($#data+1) == $nr) { - return sprintf($fmt,@data); + return chk_eval(sprintf($fmt,@data)); } else { - print STDERR "mkformat: [$data] can't be split on [$format_delimiter] to $nr fields!\n"; - return $data; + #print STDERR "mkformat: [$data] can't be split on [$format_delimiter] to $nr fields!\n"; + return chk_eval($data); } } else { print STDERR "usage of link '$format_name' without defined format ( tag)\n"; @@ -292,22 +305,23 @@ # type="display" ; field for display if ($d && $display) { + my $ldel = $delimiter; if ($line_delimiter && $display_data) { - $display_data .= $line_delimiter; + $ldel = $line_delimiter; } if ($filter) { no strict 'refs'; - if ($display_data) { - $display_data .= $delimiter.mkformat($x,join($delimiter,&$filter($display))); - } else { - $display_data = mkformat($x,join($delimiter,&$filter($display))); + my @arr; + foreach my $tmp (&$filter($display)) { + my $tmp2 = mkformat($x,$tmp); + push @arr,$tmp2 if ($tmp2); } + $display_data .= $ldel if ($display_data && @arr); + $display_data .= join($delimiter,@arr); } else { - if ($display_data) { - $display_data .= $delimiter.mkformat($x,$display); - } else { - $display_data = mkformat($x,$display); - } + $display_data .= $ldel if ($display_data); + my $tmp = mkformat($x,$display); + $display_data = $tmp if ($tmp); } } @@ -451,7 +465,8 @@ for (my $page=0; $page <= $nr_pages; $page++) { my $display_data; if ($cache->{format}->{$field}) { - $display_data=mkformat($cache->{format}->{$field},$cache->{display_data}->{$field}->[$page]); + my $tmp = mkformat($cache->{format}->{$field},$cache->{display_data}->{$field}->[$page]); + $display_data=$tmp if ($tmp); } else { $display_data = $cache->{display_data}->{$field}->[$page]; } @@ -774,23 +789,26 @@ my $marc_file = $cfg -> val($database, 'marc_file') || die "$database doesn't have 'marc_file' defined!"; # optional argument is format - my $format = x($config->{format}) || 'usmarc'; + my $format = x($config->{marc_format}) || 'usmarc'; print STDERR "Reading MARC file '$marc_file'\n"; my $marc = new MARC; my $nr = $marc->openmarc({ file=>$marc_file, format=>$format - }) || die "Can't open MARC file '$marc_file'"; + }) || die "Can't open MARC file '$marc_file' with format '$format'"; + + # read MARC file in memory + $marc->nextmarc(-1); - my $i=0; # record nr. + my $max_rec = $marc->marc_count(); - my $rec; + for(my $i=1; $i<=$max_rec; $i++) { - while ($marc->nextmarc(1)) { + progress($i,$max_rec); - # XXX - fakeprogress($i++); + # store value for marc_sf.pm + $main::cache->{marc_record} = $i; my $swishpath = $database."#".$i; @@ -802,6 +820,9 @@ print "Document-Type: XML\n\n$xml\n"; } } + + print STDERR "\n"; + } elsif ($type_base eq "feed") { $import2cp = Text::Iconv->new($config->{feed_codepage},$codepage);