#!/usr/bin/perl5
require("$ENV{'DOCUMENT_ROOT'}/leapnet/private/lib.server/main.cgi");
$MOST_RECENT_EDITION = '961';
&divy;
##########
sub divy {
##########
$NAV = &load_nav("$LNK{'LEAPNET'}:Search",5);
$BODY = &load_file('HTML','search.html');
$FOOTER = &load_file('HTML','footer.html');
$FORM = &load_file('HTML','search.form.html');
$SUBMIT = &load_file('HTML','search.results.submit.html');
if(!$ENV{'QUERY_STRING'}) {
$HEADER = &load_header('LEAPNet:Search');
$BODY =~ s//$FORM/;
$BODY =~ s/.*//gs;
&unload_page("$HEADER$NAV$BODY$FOOTER");
}
&parse_form;
foreach $key (keys %TERMS) {
$TOTAL_TERMS++;
}
if(!$TOTAL_TERMS) {
$HEADER = &load_header('Error');
$MESSAGETEXT = "Error: You did not enter any search terms.";
$BODY =~ s//$MESSAGETEXT/;
$BODY =~ s//$FORM/;
&unload_page("$HEADER$NAV$BODY$FOOTER");
}
&load_diss;
undef $TOTAL_TERMS;
foreach $key (keys %TERMS) {
if($DISS{$key} == 1) {
delete $TERMS{$key};
} else {
$TOTAL_TERMS++;
}
}
if(!$TOTAL_TERMS) {
$HEADER = &load_header('Error');
$MESSAGETEXT = "Error: Your search terms were illegal.";
$BODY =~ s//$MESSAGETEXT/;
$BODY =~ s//$FORM/;
&unload_page("$HEADER$NAV$BODY$FOOTER");
}
$FILES{$MOST_RECENT_EDITION} = 1 if !$TOTAL_FILES;
$FORM =~ s/name=\"t\" value=\"\">/name=\"t\" value=\"$FORM_VALUE\">/;
foreach $FILE (keys %FILES) {
$FORM =~ s/value=\"$FILE\">/value=\"$FILE\" checked>/;
$FILES_URL .= "&f=$FILE";
}
foreach $STATE (keys %STATES) {
$FORM =~ s/value=\"$STATE\">/value=\"$STATE\" checked>/;
$STATES_URL .= "&q=$STATE";
}
&make_evals;
eval("$S1");
$CUTOFF = 1000 if $TOTAL_TERMS == 1;
$CUTOFF = 1000 if $TOTAL_TERMS == 2;
$CUTOFF = 2000 if $TOTAL_TERMS == 3;
$CUTOFF = 3000 if $TOTAL_TERMS == 4;
$CUTOFF = 3000 if $TOTAL_TERMS == 5;
&sort_results;
if(!$TOTAL_FOUND) {
$HEADER = &load_header('Sorry, no records were found.');
$MESSAGETEXT = "
Sorry, no records were found.";
$BODY =~ s//$MESSAGETEXT<\/center>/;
$BODY =~ s//$FORM/;
&unload_page("$HEADER$NAV$BODY$FOOTER");
}
&set_scrollers;
&get_results;
$HEADER = &load_header('Results of search');
$MESSAGETEXT = "$TOTAL_FOUND articles matched";
$BODY =~ s//$MESSAGETEXT/;
$BODY =~ s//$RESULTS/;
$BODY =~ s//Results of search/;
$BODY =~ s//$SUBMIT/;
$BODY =~ s//$FORM/;
&unload_page("$HEADER$NAV$BODY$FOOTER");
}
################
sub parse_form {
################
$in = $ENV{'QUERY_STRING'};
@pairs = split(/&/,$in);
foreach $pair (@pairs) {
($name, $value) = split(/=/,$pair);
if($name eq 't') {
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$TERMS_URL = $value;
$value =~ tr/+/ /;
$FORM_VALUE = $value;
$value =~ s/ /_/gs;
$value =~ s/\W//gs;
$value =~ s/_/ /gs;
$value =~ tr/[a-z]/[A-Z]/;
@v = split(' ',$value);
$c = 0;
foreach $v (@v) {
if($v) {
$c++;
last if($c == 6);
$TERMS{$v} = 1;
}
}
} elsif($name eq 'S' && $value =~ /^\d+$/) {
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$START = $value;
} elsif($name eq 'f' && $value =~ /^\d\d\d$/) {
$FILES{$value} = 1;
$TOTAL_FILES++;
} elsif($name eq 'q') {
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/ /_/gs;
$value =~ s/\W//gs;
$value =~ s/_/ /gs;
my($TEMP) = $value;
$TEMP =~ s/ /_/gs;
$STATES{$value} = $TEMP;
$TOTAL_STATES++;
}
}
}
###############
sub load_diss {
###############
open(INPUT,"$DIR{'PRIVATE'}/search/diss.txt");
while() {
chop;
$DISS{$_} = 1;
}
close(INPUT);
}
################
sub make_evals {
################
$I = 0;
foreach $key (sort keys %TERMS) {
$S2 .= '/^.*' . $key . '.*\t/ || ';
if($I == 0) {
$S3 .= ' if';
} else {
$S3 .= 'elsif';
}
$S3 .= '(/^.*' .$key . '.*\t/) {' . "\n";
$S3 .= ' foreach $R (@R) {' . "\n";
$S3 .= ' $A{"$FILE$R"} += ';
$S3 .= length($key);
$S3 .= ' / length($W) / ';
$S3 .= $TOTAL_TERMS . ";\n";
$S3 .= ' $T{"$FILE$R" . "';
$S3 .= $I;
$S3 .= '"} = 1;' . "\n";
$S3 .= ' }' . "\n";
$S3 .= ' } ';
$T1 .= '$T{$key.\'' . $I . '\'';
$T1 .= '} + ';
$I++;
}
$S2 =~ s/ \|\| $//;
$S1 = 'foreach $FILE (keys %FILES) {' . "\n";
$S1 .= 'foreach $STATE (keys %STATES) {' . "\n" if $TOTAL_STATES;
$S1 .= ' open(INPUT,"$DIR{\'CPR\'}/$FILE$STATES{$STATE}.cpr");' . "\n";
$S1 .= ' while() {' . "\n";
$S1 .= ' if(' . $S2 . ') {' . "\n";
$S1 .= ' chop;' . "\n";
$S1 .= ' ($W,@R) = split(/\t/,$_);' . "\n";
$S1 .= $S3 . "\n";
$S1 .= ' } else {' . "\n";
$S1 .= ' next;' . "\n";
$S1 .= ' }' . "\n";
$S1 .= ' }' . "\n";
$S1 .= '}' . "\n" if $TOTAL_STATES;
$S1 .= '}' . "\n";
$T1 =~ s/ \+ $//;
$T1 = '$T{$key} = (' . $T1 . ') * 1000;' . "\n";
}
##################
sub sort_results {
##################
foreach $key (keys %A) {
#$T{$key} = ($T{$key."1"} + $T{$key."2"} + $T{$key."3"}) * 1000;
eval("$T1");
if($T{$key} < $CUTOFF) {
delete $A{$key};
delete $T{$key};
} else {
$A{$key} *= 100;
$A{$key} = 999.99 if $A{$key} >= 1000;
$A{$key} += $T{$key};
my($K) = $key;
$K =~ tr/[0123456789]/[9876543210]/;
$A{$key} = sprintf("%.2f",$A{$key}) . "$K";
$TOTAL_FOUND++;
}
}
}
#################
sub get_results {
#################
$i = 0;
foreach $key (reverse sort by_values keys %A) {
$i++;
next if $i < $START;
last if $i > $END;
if(length($key)==6) {
$RESULTS .= &get_meta($key);
}
}
}
###############
sub by_values {
###############
($A{$a} cmp $A{$b});
}
##############
sub get_meta {
##############
my($y) = @_[0];
$y =~ s/(\d\d\d)(\d\d\d)/$LEAP_LETTER = $1; $INDEX = $2;/eg;
$x = 1;
open(INPUT,"$DIR{'META'}/$LEAP_LETTER.meta");
while() {
if($x == $INDEX - 0) {
return $_;
last;
}
$x++;
}
close(INPUT);
}
###################
sub set_scrollers {
###################
$START = 1 if($START > $TOTAL_FOUND || !$START);
$END = $START + 9;
$END = $TOTAL_FOUND if($END > $TOTAL_FOUND);
$CURR = "Now showing $START thru $END";
$BODY =~ s//$CURR/;
if($START > 1) {
$PREV_START = $START - 10;
$PREV_START = 1 if ($PREV_START <= 0);
$PREV_END = $PREV_START + 9;
$PREV_END = $TOTAL_FOUND if($PREV_END > $TOTAL_FOUND);
$PREV = "[$PREV_START - $PREV_END]";
$BODY =~ s//$PREV/;
}
if($END < $TOTAL_FOUND) {
$NEXT_START = $END + 1;
$NEXT_END = $NEXT_START + 9;
$NEXT_END = $TOTAL_FOUND if($NEXT_END > $TOTAL_FOUND);
$NEXT = "
[$NEXT_START - $NEXT_END]";
$BODY =~ s//$NEXT/;
}
}