use Text::Iconv for conversions
[webpac] / WebPac.pm
index a80f991..11e2b27 100644 (file)
--- a/WebPac.pm
+++ b/WebPac.pm
@@ -6,18 +6,25 @@ use strict;
 use HTML::Pager;
 use HTML::FillInForm;
 use SWISH;
-use Unicode::String qw(utf8 utf16);
-require Unicode::Map8;
+use Text::Iconv;
+use DBI;
+
+use lib '..';
+use index_DBI;
+use back2html;
 
 # 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 $SWISH = '/usr/bin/swish-e';
 my $INDEX = '/data/webpac/index/isis.index';
 my $MAX_HITS = 500;
 my $ON_PAGE = 10;
 
+Text::Iconv->raise_error(1);     # Conversion errors raise exceptions
+
+my $from_utf8 = Text::Iconv->new('UTF8', $CHARSET);
 
 sub setup {
        my $self = shift;
@@ -25,7 +32,8 @@ sub setup {
        $self->run_modes(
                'search' => 'show_search_form',
                'results' => 'show_results_list',
-#              'user' => 'show_user_detail'
+#              'user' => 'show_user_detail',
+               'index' => 'show_index',
        );
        $self->start_mode('search');
        $self->mode_param('rm');
@@ -56,13 +64,13 @@ sub show_results_list {
        my @swish_results;      # results from swish
 
        # load template for this page
-       my $tmpl = $self->load_tmpl('results.html');
 
        my @s_arr;      # all queries are located here
 
        for(my $i = 1; $i <=10; $i++) {
 
-               last if (! $q->param("f$i"));
+               return show_index($self, $i) if ($q->param("f".$i."_index"));
+               next if (! $q->param("f$i"));
                next if (! $q->param("v$i"));
 
                # re-write query from +/- to and/and not
@@ -84,30 +92,26 @@ sub show_results_list {
                        }
                }
 
-               push @s_arr,$q->param("f$i")."=($s)";
+               push @s_arr,$q->param("f$i")."_swish=($s)";
        }
 
-       my $l2_map = Unicode::Map8->new($CHARSET) || die;
-       my $us = Unicode::String->new();
+       my $tmpl = $self->load_tmpl('results.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 => $from_utf8->convert($hit->headline),
+                               html => back2html($from_utf8->convert($hit->html)),
                                rank => $hit->swishrank };
 
-#                      my @fields = $hit->field_names;
-#                      print "Field '$_' = '", $hit->$_, "'<br>\n" for sort @fields;
                },
                #startnum => 0,
                maxhits => $MAX_HITS,
@@ -161,4 +165,52 @@ sub show_results_list {
        return $html;
 }
  
+sub show_index {
+       my $self = shift;
+       my $i = shift;          # field number
+
+       my $q = $self->query();
+
+       my $field = $q->param("f$i");
+       my $limit = $q->param("v$i");
+
+       my $html;
+
+       my $index = new index_DBI();
+
+       my $total = $index->check($field);
+       if (! $total) {
+               my $tmpl = $self->load_tmpl('no_index.html');
+               $tmpl->param('field',$field);
+               $html = $tmpl->output;
+               return $html;
+       }
+
+       my $tmpl = $self->load_tmpl('index_res.html');
+       $tmpl->param('field',$field);
+       $tmpl->param('limit',$limit);
+       $tmpl->param('total',$total);
+
+       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;