--- trunk/WebPac.pm 2003/06/01 18:49:49 53 +++ trunk/WebPac.pm 2003/07/16 15:49:56 114 @@ -9,27 +9,29 @@ use Text::Iconv; use DBI; use Config::IniFiles; +use Text::Unaccent; use lib '..'; use index_DBI; use back2html; -# configuration options -# FIXME they really should go in configuration file! -my $TEMPLATE_PATH = '/data/webpac/template_html'; -my $CHARSET = 'ISO-8859-2'; -my $SWISH = '/usr/bin/swish-e'; -my $INDEX = '/data/webpac/index/isis.index'; -my $MAX_HITS = 500; -my $ON_PAGE = 10; + +# read global.conf configuration +my $cfg_global = new Config::IniFiles( -file => '../global.conf' ) || die "can't open 'global.conf'"; + +# configuration options from global.conf +my $TEMPLATE_PATH = $cfg_global->val('webpac', 'template_html') || die "need template_html in global.conf, section webpac"; +my $CHARSET = $cfg_global->val('webpac', 'charset') || 'ISO-8859-1'; +my $SWISH = $cfg_global->val('webpac', 'swish') || '/usr/bin/swish-e'; +my $INDEX = $cfg_global->val('webpac', 'index') || die "need index in global.conf, section webpac"; +my $MAX_HITS = $cfg_global->val('webpac', 'max_hits') || 0; +my $ON_PAGE =$cfg_global->val('webpac', 'on_page') || 10; + Text::Iconv->raise_error(0); # Conversion errors raise exceptions my $from_utf8 = Text::Iconv->new('UTF8', $CHARSET); -# read global.conf configuration -my $cfg_global = new Config::IniFiles( -file => '../global.conf' ) || die "can't open 'global.conf'"; - sub setup { my $self = shift; @@ -75,39 +77,59 @@ my @path_arr = $q->param('path'); my $full = $q->param('full'); - for(my $i = 1; $i <=10; $i++) { + my @persist_vars = ( 'rm' ); + + for(my $i = 1; $i <=30; $i++) { return show_index($self, $i) if ($q->param("f".$i."_index")); - next if (! $q->param("f$i")); + next if (! $q->param("v$i")); + next if (! $q->param("f$i")); + + push @persist_vars, "f$i"; + push @persist_vars, "v$i"; # re-write query from +/- to and/and not - my $s; - my $search = $q->param("v$i"); - while ($search =~ s/\s*("[^"]+")\s*/ /) { - $s .= "$1 "; - } - $search =~ s/^\s+//; - $search =~ s/\s+$//; + my @param_vals = $q->param("v$i"); + my @swish_q; + while (my $search = shift @param_vals) { + my $s; + # remove accents + $search = unac_string($CHARSET,$search); + while ($search =~ s/\s*("[^"]+")\s*/ /) { + $s .= "$1 "; + } + $search =~ s/^\s+//; + $search =~ s/\s+$//; - foreach (split(/\s+/,$search)) { - if (m/^([+-])(\S+)/) { - $s.= ($s) ? "and " : ""; - $s.="not " if ($1 eq "-"); - $s.="$2* "; - } elsif (m/(and|or|not)/i) { - $s.="$_ "; - } else { - $s.="$_* "; + foreach (split(/\s+/,$search)) { + if (m/^([+-])(\S+)/) { + $s.= ($s) ? "and " : ""; + $s.="not " if ($1 eq "-"); + $s.="$2* "; + } elsif (m/(and|or|not)/i) { + $s.="$_ "; + } else { + $s.="$_* "; + } } + $s =~ s/\*+/*/g; + push @swish_q,$s; } - $s =~ s/\*+/*/g; - - push @s_arr,$q->param("f$i")."_swish=($s)"; + # FIXME default operator for multi-value fields is or. There is + # no way to change it, except here for now. Is there need? + push @s_arr, $q->param("f$i")."_swish=(".join(" or ",@swish_q).")"; } my $tmpl = $self->load_tmpl('results.html'); + sub esc_html { + my $html = shift; + $html =~ s//>/g; + return $html; + } + # call swish my $sh = SWISH->connect('Fork', prog => $SWISH, @@ -119,7 +141,7 @@ push @swish_results, { nr => ($#swish_results + 2), path => $hit->swishdocpath, - headline => $from_utf8->convert($hit->headline), + headline => esc_html($from_utf8->convert($hit->headline)), html => back2html($from_utf8->convert($hit->html)), rank => $hit->swishrank }; @@ -129,10 +151,9 @@ ); die $SWISH::errstr unless $sh; - # construct swish query my $sw_q = join(" and ",@s_arr); - if (@path_arr) { + if (@path_arr && $q->param('show_full')) { $sw_q .= "and (swishdocpath=\""; $sw_q .= join("\" or swishdocpath=\"",@path_arr); $sw_q .= "\")"; @@ -156,25 +177,21 @@ my @result; for (my $i=0; $i<$rows; $i++) { - push @result, $swish_results[$offset+$i] if $swish_results[$offset+$i]; + my $r = $swish_results[$offset+$i]; + if ($r && $q->param('show_full')) { + push @result, $r; + } elsif ($r) { + # if not full output, skip html + delete $r->{html}; + push @result, $r; + } } return \@result; }, rows => $hits, page_size => $ON_PAGE, # some optional parameters - persist_vars => [ - 'rm', - 'f1', 'v1', - 'f2', 'v2', - 'f3', 'v3', - 'f4', 'v4', - 'f5', 'v5', - 'f6', 'v6', - 'f7', 'v7', - 'f8', 'v8', - 'f9', 'v9', - ], + persist_vars => [ @persist_vars ], #cell_space_color => '#000000', #cell_background_color => '#ffffff', #nav_background_color => '#dddddd',