#!/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/; } }