&parse_form; print "Content-Type: text/html\n\n"; if ( !open( FL, $page_model ) ) { print "Couldn't open page model\n"; exit(1); } read FL, $model, -s $page_model; close FL; ( $model_top, $model_bot ) = split /#####/, $model; $extra = ''; $title = ''; @words = (); if ( exists $form{'words'} ) { $search_words = $form{'words'}; if ( $form{'wt'} eq 'be' ) { $search_wb = ' checked'; $search_ew = ''; } else { $search_wb = ''; $search_ew = ' checked'; } if ( $form{'bl'} eq 'an' ) { $search_bAND = ' checked'; $search_bOR = ''; $search_bPHR = ''; } elsif ( $form{'bl'} eq 'ph' ) { $search_bAND = ''; $search_bOR = ''; $search_bPHR = ' checked'; } else { $search_bAND = ''; $search_bOR = ' checked'; $search_bPHR = ''; } $wl = lc $search_words; $wl =~ tr/a-z0-9/ /c; $wl =~ s/(\A\s+)|(\s+\Z)//g; @words = split /\s+/, $wl; if ( $wl eq '' || $#words < 0 ) { $extra = "Please enter some words in the search box.
"; @words = (); } else { $title = join ' ', 'Search results for', @words; } $search_q = $ENV{'QUERY_STRING'}; $search_q =~ s/\&pg=\d+//; } else { $search_words = ''; $search_wb = ' checked'; $search_ew = ''; $search_bAND = ''; $search_bOR = ' checked'; $search_bPHR = ''; } if ( $title ne '' ) { $model_top =~ s~(.+?)~$title~si; } print $model_top; if ( $#words >= 0 ) { %pages = (); $go = 1; for ( $word = 0 ; $word <= $#words && $go ; $word++ ) { ( $i, $gs ) = split //, $words[$word], 3; $g = $grains[ ord($gs) ]; if ( open( FL, "$index_loc/$i.$g" ) ) { $found = 0; $pat = "\\A$words[$word]"; if ( $search_wb eq '' ) { $pat .= '\\s'; } %pages2 = (); while () { if (m/$pat/) { $found = 1; ( $wd, $pg ) = split / /, $_, 2; @vp = split /#/, $pg; $mul = ( $#words + 1 ) - $word; if ( $word > 0 && $search_bOR eq '' ) { for (@vp) { /\A(.+):(\d+?)\Z/; if ( exists $pages{"I$1"} ) { $pages2{"I$1"} = $pages{"I$1"} * ( $2 * $mul ); } } } else { for (@vp) { /\A(.+):(\d+?)\Z/; if ( exists $pages{"I$1"} ) { $pages{"I$1"} *= ( $2 * $mul ); } else { $pages{"I$1"} = ( $2 * $mul ); } } } } } if ( $word > 0 && $search_bOR eq '' ) { %pages = %pages2; %pages2 = (); } close FL; } else { if ( $search_bAND ne '' || $search_bPHR ne '' ) { $pages = (); $go = 0; } } } if ( $search_bPHR ne '' && $#words > 0 ) { if ( $search_wb ne '' ) { $pat = '\b' . join( '\w*?\s+', @words ); } else { $pat = '\b' . join( '\s+', @words ) . '\b'; } @ps = keys %pages; for $pg (@ps) { if ( $pg =~ m/I(.+)/ ) { if ( open FL, "$docroot_disc/$1" ) { read FL, $pt, -s "$docroot_disc/$1"; close FL; $pt =~ s/<.+?>//gs; if ( !( $pt =~ m/$pat/gis ) ) { delete $pages{$pg}; } } else { delete $pages{$pg}; } } } } @pages = sort { $pages{$b} <=> $pages{$a} } keys %pages; $found = $#pages + 1; $page_begin = 0; $this_page = 0; if ( $res_per_page != -1 ) { $end = ( $res_per_page - 1 ); if ( exists $form{'pg'} ) { $this_page = $form{'pg'}; $this_page =~ tr/0-9//cd; if ( $this_page eq '' ) { $this_page = 0 } $page_begin = $this_page * $res_per_page; $end = ( $page_begin + $res_per_page - 1 ); } if ( $end > $#pages ) { $end = $#pages } @pages = @pages[ $page_begin .. $end ]; } $shown = $#pages + 1; if ($high_results) { $disp_root = "$page_script?$search_q&d="; } else { $disp_root = $docroot_web; } if ( $#pages >= 0 ) { print "

Search results ($found found, $shown shown)

\n"; $n = $page_begin + 1; for $pg (@pages) { if ( $pg =~ m/(\w)(.+)/ ) { if ( $1 eq 'I' ) { $fn = $2; if ( open FL, "$docroot_disc/$fn" ) { read FL, $pt, 1024; close FL; if ( $pt =~ m~(.+?)~gis ) { $title = $1 } else { $title = '(no title)' } print qq~$n -

$title

\n~; } } else { print "(result type not known)
\n"; } } $n++; } print "\n"; } else { print "No matching pages found.

\n"; } if ( $res_per_page != -1 ) { if ( $found != $shown ) { $pages = int( ( $found / $res_per_page ) + 1 ); print "$pages pages : \n"; if ( $this_page != 0 ) { $p = $this_page - 1; print qq~

<

~; } else { print "< "; } for ( $p = 0 ; $p < $pages ; $p++ ) { $n = $p + 1; if ( $p == $this_page ) { print " $n "; } else { print qq~

$n

~; } } if ( $this_page != ( $pages - 1 ) ) { $p = $this_page + 1; print qq~

>

\n~; } else { print " >\n"; } } else { print "1 page of results only\n"; } } } print <<__EOF;
$extra Search for:

(put most important words first)
Find: Words beginning Entire words
Require: All words Any word Phrase
__EOF print $model_bot; exit(0); sub parse_form { %form = (); my $buffer; if ( $ENV{'REQUEST_METHOD'} eq 'POST' ) { read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split( /&/, $buffer ); foreach $pair (@pairs) { ( $name, $value ) = split( /=/, $pair ); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $form{$name} = $value; } }