/[swish]/trunk/html/swish.cgi
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/html/swish.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 21 - (hide annotations)
Tue Mar 18 20:20:11 2003 UTC (21 years, 1 month ago) by dpavlin
File size: 3572 byte(s)
support for different properties in output (aside from standard ones) and
formatting of output for each hit

1 dpavlin 8 #!/usr/bin/perl -w
2    
3     use strict;
4     use CGI qw/:standard -no_xhtml/;
5     use CGI::Carp qw(fatalsToBrowser);
6     use SWISH;
7     use XML::Simple;
8     use Lingua::Spelling::Alternative;
9     use Text::Iconv;
10    
11     Text::Iconv->raise_error(0); # Conversion errors raise exceptions
12     my $config=XMLin(undef,
13     # keyattr => { label => "value" },
14     forcecontent => 0,
15     );
16    
17 dpavlin 18 my $from_utf8 = Text::Iconv->new('UTF8', $config->{charset});
18     sub x {
19     return $from_utf8->convert($_[0]);
20     }
21    
22 dpavlin 8 use Data::Dumper;
23     #print Dumper($config);
24    
25     my $spelling_alt;
26     # FIX: doesn't work very well
27 dpavlin 16 if ($config->{findaffix}) {
28 dpavlin 8 $spelling_alt = new Lingua::Spelling::Alternative;
29 dpavlin 18 $spelling_alt->load_findaffix(x($config->{findaffix}));
30 dpavlin 8 }
31 dpavlin 16 if ($config->{affix}) {
32     $spelling_alt = new Lingua::Spelling::Alternative;
33 dpavlin 18 $spelling_alt->load_affix(x($config->{affix}));
34 dpavlin 16 }
35 dpavlin 8
36     my $hits=0;
37 dpavlin 18 my $max_hits=x($config->{max_hits});
38 dpavlin 8
39     my %labels;
40     foreach (@{$config->{labels}->{label}}) {
41 dpavlin 18 $labels{$_->{value}} = x($_->{content});
42 dpavlin 8 }
43    
44 dpavlin 16 if ($config->{charset}) {
45 dpavlin 18 print header(-charset=>x($config->{charset}));
46 dpavlin 16 } else {
47     print header;
48     }
49 dpavlin 18 print start_html(-title=>x($config->{title})),start_form;
50     print x($config->{text}->{search});
51 dpavlin 16 print popup_menu(-name=>'max_hits',-values=>[ sort keys %labels ],-labels=>\%labels,-default=>$max_hits);
52 dpavlin 18 print x($config->{text}->{documents});
53 dpavlin 16 print textfield('search');
54 dpavlin 18 print submit(-value=> x($config->{text}->{submit}));
55     print checkbox(-name=>'no_affix', -checked=>0, -label=>x($config->{text}->{no_spell})) if ($spelling_alt);
56 dpavlin 8 print end_form,hr;
57    
58     if (param('search')) {
59    
60     my $s;
61     # re-write query from +/- to and/and not
62    
63     my $search = param('search');
64     my $s_phrase = "";
65     while ($search =~ s/\s*("[^"]+")\s*/ /) {
66     $s .= "$1 ";
67     }
68     $search =~ s/^\s+//;
69     $search =~ s/\s+$//;
70    
71     foreach (split(/\s+/,$search)) {
72     if (m/^([+-])(\S+)/) {
73     $s.= ($s) ? "and " : "";
74     $s.="not " if ($1 eq "-");
75     if ($spelling_alt && !param('no_affix')) {
76     my $w = $2; $w =~ s/[\*\s]+//g;
77     $w =~ s/^(['"]*)([^'"]+)(['"]*)/$2/;
78     $s.="$1(".join("* or ",$spelling_alt->alternatives($w))."*)$3 ";
79     } else {
80     $s.="$2* ";
81     }
82     } else {
83     if ($spelling_alt && !param('no_affix')) {
84     my $w = $_; $w =~ s/[\*\s]+//g;
85     #$s.="(".join("* or ",$spelling_alt->alternatives($w))."*) ";
86     $s.="(".join("* or ",$spelling_alt->alternatives($w))."*) ";
87     } else {
88     $s.="$_* ";
89     }
90     }
91     }
92    
93     # fixup search string
94     $s=~tr/šðžèæŠÐŽÈÆ/¹ð¾èæ©Ð®ÈÆ/; # 1250 -> iso8859-2
95     $s=~tr/¹©ðÐèÈæƾ®/sSdDcCcCzZ/;
96     $s=~s/\*\*+/*/g;
97    
98 dpavlin 21 my @properties = split(/\s+/,x($config->{properties}));
99    
100 dpavlin 8 my $sh = SWISH->connect('Fork',
101 dpavlin 18 prog => x($config->{prog}),
102     indexes => x($config->{index}),
103 dpavlin 21 properties => \@properties,
104 dpavlin 8 results => sub {
105     my ($sh,$hit) = @_;
106    
107 dpavlin 21 my $hit_fmt = x($config->{hit}) ||
108     "<a href=\"%s\">%s</a> [%s]<br>\n";
109    
110 dpavlin 18 if ($config->{url}) {
111 dpavlin 21 printf ($hit_fmt ,"http://".virtual_host().x($config->{url}).$hit->swishdocpath,$hit->swishtitle || 'untitled',$hit->swishrank);
112 dpavlin 18 } else {
113 dpavlin 21 printf ($hit_fmt ,$hit->swishdocpath,$hit->swishtitle || 'untitled',$hit->swishrank, map($hit->$_, @properties) );
114 dpavlin 8
115 dpavlin 18 }
116    
117 dpavlin 8 # print $_[1]->as_string,"<br>\n";
118     # my @fields = $hit->field_names;
119     # print "Field '$_' = '", $hit->$_, "'<br>\n" for sort @fields;
120     },
121     maxhits => param('max_hits') || $max_hits,
122     );
123    
124     die $SWISH::errstr unless $sh;
125    
126    
127     $hits = $sh->query($s);
128    
129     if ($hits > 0) {
130 dpavlin 16 print p,hr;
131 dpavlin 18 printf (x($config->{text}->{hits}),$hits,param('max_hits') || $max_hits,$s);
132 dpavlin 8 } else {
133 dpavlin 16 print p;
134 dpavlin 18 printf (x($config->{text}->{no_hits}),$s,$sh->errstr);
135 dpavlin 8 }
136     } else {
137 dpavlin 18 print p(x($config->{text}->{footer}));
138 dpavlin 8 }

Properties

Name Value
cvs2svn:cvs-rev 1.4
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26