--- trunk/all2xml.pl 2003/12/15 00:12:16 196 +++ trunk/all2xml.pl 2004/01/31 21:03:06 207 @@ -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"; @@ -282,44 +295,33 @@ no strict 'refs'; my $tmp = join(" ",&$filter($swish)) if ($s || $se); $swish_data .= $tmp if ($s); - if ($se) { - if ($swish_exact_data) { - $swish_exact_data .= "xxexx xxbxx ".$tmp; - } else { - $swish_exact_data .= $tmp; - } - } + $swish_exact_data .= "xxbxx $tmp xxexx " if ($se && $tmp ne ""); } else { $swish_data .= $swish if ($s); - if ($se) { - if ($swish_exact_data) { - $swish_exact_data .= "xxexx xxbxx ".$swish; - } else { - $swish_exact_data .= $swish; - } - } + $swish_exact_data .= "xxbxx $swish xxexx " if ($se && $swish ne ""); } } # 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.join($delimiter,mkformat($x,&$filter($display))); - } else { - $display_data = join($delimiter,mkformat($x,&$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); } } @@ -463,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]; } @@ -494,7 +497,7 @@ # add delimiters before and after word. # That is required to produce exact match - $xml .= xmlify($field."_swish_exact", unac_string($codepage,'xxbxx '.$swish_exact_data.' xxexx')); + $xml .= xmlify($field."_swish_exact", unac_string($codepage,$swish_exact_data)); } my $idel = $cache->{index_delimiter}->{$field}; @@ -536,7 +539,7 @@ # add delimiters before and after word. # That is required to produce exact match - $xml .= xmlify($field."_swish_exact", unac_string($codepage,'xxbxx '.$swish_exact_data.' xxexx')); + $xml .= xmlify($field."_swish_exact", unac_string($codepage,$swish_exact_data)); } } }