/[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

Diff of /trunk/html/swish.cgi

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 23 by dpavlin, Fri Mar 21 21:10:51 2003 UTC revision 57 by dpavlin, Sun Jan 25 16:49:50 2004 UTC
# Line 19  sub x { Line 19  sub x {
19          return $from_utf8->convert($_[0]);          return $from_utf8->convert($_[0]);
20  }  }
21    
22  use Data::Dumper;  # Escape <, >, & and ", and to produce valid XML
23  #print Dumper($config);  my %escape = ('<'=>'&lt;', '>'=>'&gt;', '&'=>'&amp;', '"'=>'&quot;');  
24    my $escape_re  = join '|' => keys %escape;
25    sub e {
26            my $out;
27            foreach my $v (@_) {
28                    $v =~ s/($escape_re)/$escape{$1}/g;
29                    $out .= $v;
30            }
31            return $out;
32    }
33    
34  my $spelling_alt;  my @spellings;
35  # FIX: doesn't work very well  # FIX: doesn't work very well
36  if ($config->{findaffix}) {  if ($config->{findaffix}) {
37          $spelling_alt = new Lingua::Spelling::Alternative;          foreach my $findaffix (split(/[, ]+/,x($config->{findaffix}))) {
38          $spelling_alt->load_findaffix(x($config->{findaffix}));                  my $spelling_alt = new Lingua::Spelling::Alternative;
39                    $spelling_alt->load_findaffix($findaffix);
40                    push @spellings,$spelling_alt;
41            }
42  }  }
43  if ($config->{affix}) {  if ($config->{affix}) {
44          $spelling_alt = new Lingua::Spelling::Alternative;          foreach my $affix (split(/[, ]+/,x($config->{affix}))) {
45          $spelling_alt->load_affix(x($config->{affix}));                  my $spelling_alt = new Lingua::Spelling::Alternative;
46                    $spelling_alt->load_affix($affix);
47                    push @spellings,$spelling_alt;
48            }
49  }  }
50    
51  my $hits=0;  my $hits=0;
# Line 45  my $path = param('path');      # limit to thi Line 60  my $path = param('path');      # limit to thi
60  my %path_label;  my %path_label;
61  my @path_name;  my @path_name;
62  foreach (@{$config->{paths}->{path}}) {  foreach (@{$config->{paths}->{path}}) {
63    
64    print STDERR "##: $_->{limit}",x($_->{content}),"\n";
65          push @path_name,x($_->{limit});          push @path_name,x($_->{limit});
66          $path_label{$_->{limit}} = x($_->{content});          $path_label{$_->{limit}} = x($_->{content});
67  }  }
68    
69    my @properties = split(/\s+/,x($config->{properties}));
70    
71  if ($config->{charset}) {  if ($config->{charset}) {
72          print header(-charset=>x($config->{charset}));          print header(-charset=>x($config->{charset}));
73  } else {  } else {
# Line 60  print popup_menu(-name=>'max_hits',-valu Line 79  print popup_menu(-name=>'max_hits',-valu
79  print x($config->{text}->{documents});  print x($config->{text}->{documents});
80  print textfield('search');  print textfield('search');
81  print submit(-value=> x($config->{text}->{submit}));  print submit(-value=> x($config->{text}->{submit}));
82  print checkbox(-name=>'no_affix', -checked=>0, -label=>x($config->{text}->{no_spell})) if ($spelling_alt);  print br,checkbox(-name=>'no_affix', -checked=>0, -label=>x($config->{text}->{no_spell})) if (@spellings);
83    print checkbox(-name=>'no_properties', -checked=>0, -label=>($config->{text}->{no_properties})) if (@properties);
84  if (@path_name) {  if (@path_name) {
85          print br,x($config->{text}->{limit});          print br,x($config->{text}->{limit});
86          print popup_menu(-name=>'path',-values=>\@path_name,-labels=>\%path_label,-default=>$path);          print popup_menu(-name=>'path',-values=>\@path_name,-labels=>\%path_label,-default=>$path);
# Line 80  if (param('search')) { Line 100  if (param('search')) {
100          $search =~ s/^\s+//;          $search =~ s/^\s+//;
101          $search =~ s/\s+$//;          $search =~ s/\s+$//;
102    
103            my %words;
104    
105          foreach (split(/\s+/,$search)) {          foreach (split(/\s+/,$search)) {
106                  if (m/^([+-])(\S+)/) {                  if (m/^([+-])(\S+)/) {
107                          $s.= ($s) ? "and " : "";                          $s.= ($s) ? "and " : "";
108                          $s.="not " if ($1 eq "-");                          $s.="not " if ($1 eq "-");
109                          if ($spelling_alt && !param('no_affix')) {                          if (@spellings && !param('no_affix')) {
110                                  my $w = $2; $w =~ s/[\*\s]+//g;                                  my $w = $2; $w =~ s/[\*\s]+//g;
111                                  $w =~ s/^(['"]*)([^'"]+)(['"]*)/$2/;                                  $w =~ s/^(['"]*)([^'"]+)(['"]*)/$2/;
112                                  $s.="$1(".join("* or ",$spelling_alt->alternatives($w))."*)$3 ";                                  my $or="";
113                                    foreach my $spelling_alt (@spellings) {
114                                            $s.="$or$1(".join("* or ",$spelling_alt->alternatives($w))."*)$3 ";
115                                            $or = "or ";
116                                    }
117                          } else {                          } else {
118                                  $s.="$2* ";                                  $s.="$2* ";
119                          }                          }
120                  } else {                  } else {
121                          if ($spelling_alt && !param('no_affix')) {                          if (@spellings && !param('no_affix')) {
122                                  my $w = $_; $w =~ s/[\*\s]+//g;                                  my $w = $_; $w =~ s/[\*\s]+//g;
123                                  #$s.="(".join("* or ",$spelling_alt->alternatives($w))."*) ";                                  #$s.="(".join("* or ",$spelling_alt->alternatives($w))."*) ";
124                                  $s.="(".join("* or ",$spelling_alt->alternatives($w))."*) ";                                  my $or="";
125                                    foreach my $spelling_alt (@spellings) {
126                                            $s.="$or(".join("* or ",$spelling_alt->alternatives($w))."*) ";
127                                            $or = "or ";
128                                    }
129                          } else {                          } else {
130                                  $s.="$_* ";                                  $s.="$_* ";
131                          }                          }
# Line 108  if (param('search')) { Line 138  if (param('search')) {
138          $s=~s/\*\*+/*/g;          $s=~s/\*\*+/*/g;
139    
140          # limit to some path          # limit to some path
141          $s = "swishdocpath=($path) and $s" if ($path);          $s = "swishdocpath=(\"*$path*\") and $s" if ($path);
142    
143          my %params;     # optional parametars for swish          my %params;     # optional parametars for swish
144    
145          my @properties = split(/\s+/,x($config->{properties}));          # default format for output
146          $params{properties} = \@properties if (@properties);          my $hit_fmt = "<a href=\"%s\">%s</a> [%s]<br>\n";
147    
148            if (@properties) {
149                    $hit_fmt = x($config->{hit}) if (! param('no_properties'));
150                    $params{properties} = \@properties;
151            } else {
152                    $hit_fmt = x($config->{hit}) if (x($config->{hit}));
153            }
154    
155            sub kill_html {
156                    my @out;
157                    foreach (@_) {
158                            s/<[^>]+>//g;
159                            push @out,$_;
160                    }
161                    return @out;
162            }
163    
164          my $sh = SWISH->connect('Fork',          my $sh = SWISH->connect('Fork',
165                  prog     => x($config->{prog}),                  prog     => x($config->{prog}),
# Line 121  if (param('search')) { Line 167  if (param('search')) {
167                  results  => sub {                  results  => sub {
168                          my ($sh,$hit) = @_;                          my ($sh,$hit) = @_;
169    
                         my $hit_fmt = x($config->{hit}) ||  
                                 "<a href=\"%s\">%s</a> [%s]<br>\n";  
   
170                          if ($config->{url}) {                          if ($config->{url}) {
171                                  printf ($hit_fmt ,"http://".virtual_host().x($config->{url}).$hit->swishdocpath,$hit->swishtitle || 'untitled',$hit->swishrank);                                  printf ($hit_fmt ,"http://".virtual_host().x($config->{url}).$hit->swishdocpath,e($hit->swishtitle) || 'untitled',$hit->swishrank, map($hit->$_, @properties));
172                          } else {                          } else {
173                                  printf ($hit_fmt ,$hit->swishdocpath,$hit->swishtitle || 'untitled',$hit->swishrank, map($hit->$_, @properties) );                                  printf ($hit_fmt ,$hit->swishdocpath,e($hit->swishtitle) || 'untitled',$hit->swishrank, map($hit->$_, @properties) );
174    
175                          }                          }
176    
# Line 144  if (param('search')) { Line 187  if (param('search')) {
187    
188          $hits = $sh->query($s);          $hits = $sh->query($s);
189    
190          if ($hits > 0) {          if ($hits && $hits > 0) {
191                  print p,hr;                  print p,hr;
192                  printf (x($config->{text}->{hits}),$hits,param('max_hits') || $max_hits,$s);                  printf (x($config->{text}->{hits}),$hits,param('max_hits') || $max_hits,$s);
193          } else {          } else {

Legend:
Removed from v.23  
changed lines
  Added in v.57

  ViewVC Help
Powered by ViewVC 1.1.26