--- trunk/WebPac.pm 2003/01/11 19:55:30 9 +++ trunk/WebPac.pm 2003/07/08 08:24:13 80 @@ -6,18 +6,31 @@ use HTML::Pager; use HTML::FillInForm; use SWISH; -use Unicode::String qw(utf8 utf16); -require Unicode::Map8; +use Text::Iconv; use DBI; +use Config::IniFiles; +use Text::Unaccent; -# configuration options -# FIX: they really should go in configuration file! -my $TEMPLATE_PATH = '/data/webpac/template_html'; -my $CHARSET = 'ISO-8859-2'; -my $SWISH = '/data/swish/swish-e'; -my $INDEX = '/data/webpac/index/isis.index'; -my $MAX_HITS = 500; -my $ON_PAGE = 10; +use lib '..'; +use index_DBI; +use back2html; + + +# 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); sub setup { @@ -61,68 +74,93 @@ my @s_arr; # all queries are located here - for(my $i = 1; $i <=10; $i++) { + my @path_arr = $q->param('path'); + my $full = $q->param('full'); + + 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")); # 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* "; - } 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; } - - 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'); - my $l2_map = Unicode::Map8->new($CHARSET) || die; - my $us = Unicode::String->new(); + sub esc_html { + my $html = shift; + $html =~ s//>/g; + return $html; + } # call swish my $sh = SWISH->connect('Fork', prog => $SWISH, indexes => $INDEX, - #properties => [qw/god br nr/], + properties => [qw/swishdocpath swishrank swishtitle headline html/], results => sub { my ($sh,$hit) = @_; - $us->utf8($hit->swishtitle); - push @swish_results, { nr => ($#swish_results + 2), path => $hit->swishdocpath, - title => $l2_map->to8($us->utf16), + headline => esc_html($from_utf8->convert($hit->headline)), + html => back2html($from_utf8->convert($hit->html)), rank => $hit->swishrank }; -# my @fields = $hit->field_names; -# print "Field '$_' = '", $hit->$_, "'
\n" for sort @fields; }, #startnum => 0, - maxhits => $MAX_HITS, + maxhits => $MAX_HITS ); die $SWISH::errstr unless $sh; + # construct swish query + my $sw_q = join(" and ",@s_arr); + if (@path_arr) { + $sw_q .= "and (swishdocpath=\""; + $sw_q .= join("\" or swishdocpath=\"",@path_arr); + $sw_q .= "\")"; + $tmpl->param('full',1); # show full records + } - my $hits = $sh->query(join(" and ",@s_arr)) || 0; # FIX: and/or + my $hits = $sh->query($sw_q); $tmpl->param('hits',$hits); - $tmpl->param('search',join(" and ",@s_arr)); + $tmpl->param('search',$sw_q); + + $tmpl->param('PAGER_offset',$q->param("PAGER_offset") || 0); + $tmpl->param('last_PAGER_offset',$q->param("last_PAGER_offset") || 0); # create a Pager object my $pager = HTML::Pager->new( @@ -171,12 +209,56 @@ my $q = $self->query(); + my $field = $q->param("f$i"); + my $limit = $q->param("v$i"); + my $html; - $html .= "show index of ".$q->param("f$i")." for ".$q->param("v$i"); + my $index = new index_DBI( + $cfg_global->val('global', 'dbi_dbd'), + $cfg_global->val('global', 'dbi_dsn'), + $cfg_global->val('global', 'dbi_user'), + $cfg_global->val('global', 'dbi_passwd') || '' + ); + my $total = $index->check($field); + if (! $total) { + my $tmpl = $self->load_tmpl('no_index.html'); + $tmpl->param('field',$field); + $html = $tmpl->output; + return $html; + } - return $html; + my $tmpl = $self->load_tmpl('index_res.html'); + $tmpl->param('field',$field); + $tmpl->param('limit',$limit); + $tmpl->param('total',$total); + +# FIXME I should set offset and leave out limit from fetch!! +# if (! $q->param("PAGER_offset") { +# $q->param("Pager_offet) +# } + + my $pager = HTML::Pager->new( + query => $q, + get_data_callback => sub { + my ($offset, $rows) = @_; + + my @result = $index->fetch($field,'item',$limit, $offset, $rows); + return \@result; + }, + rows => $total, + page_size => $ON_PAGE, + persist_vars => [ + 'rm', + "f$i", "v$i", "f".$i."_index", + 'offset', + ], + debug => 1, + template => $tmpl, + ); + + return $pager->output; } 1;