#!/usr/bin/perl use YBG; require '/var/www/web9/cgi-bin/cgi/code-lib.pl'; $|=1; (*in, *filenames, *order) = &CGI_getvars(); %fields = ( theol => {key => 'name', extra => 'text'}, plays => {key => 'title', extra => 'scenario, prince, sceptichank, freefloater, luvalot'}, gloss => {key => 'term', extra => 'description'}, key => {key => 'concept', extra => 'intro, stories, extracts, bible, theologians, parallels'}, moral => {key => 'title', extra => 'fulltext'} ); print "Content-type: text/html\n\n"; $header = &readFile("$templateDir/header.html"); $footer = &readFile("$templateDir/footer.html"); $header=~s/(?<= YBGud\? )(?=<\/title>)/- Search results/o; print "$header\n\n<div id=\"main\"> <div id=\"search\">\n\n"; print "<h1>YBGud Search</h1><p>Enter your search terms in the box below and select which areas of the site to you wish to search</p>" unless ($in{'submit'}); foreach $table qw(theol plays gloss key moral){ push @tables, $table if ($in{$table}); } @tables = qw(theol plays gloss key moral) unless ($tables[0]); if ($in{'string'} eq '"Siān rules"'){ print "<div id=\"sian\"><b>Yay!</b> Sian rules!<br><br><span style=\"font-size: medium;\">All shall love her and despair!</span></div>"; print "</div></div>\n\n$footer"; exit; } print &form(); @terms1 = split /\s/, $in{string}; $i = 0; foreach $term (@terms1){ $flag = 1 if ($term=~s/^"//); $flag = 0 if ($term=~s/"$//); $terms[$i] .= "$term "; chop $terms[$i++] unless ($flag); } $ybg=YBG->database; $named, $results = searchSite(@terms); foreach $table (sort keys %named){ $searchResults.= "<h4>". $areas{$table} ."s</h4><ul class=\"small\">"; foreach $result (sort keys %{$named{$table}}){ foreach $entry (keys %{$named{$table}{$result}}){ if ($table eq 'moral'){ my $info = $ybg->get_where($table, [area, section], "refno = '$entry'"); my $letter = $moralsections{$info->{$entry}{'section'}}; $letter =~ s/^([A-E])\..+/\1/o; $searchResults.= "<li><a href=\"/$dirs{$table}/$info->{$entry}{'area'}$letter.html#$entry\">$named{$table}{$result}{$entry}</a></li>\n"; } else { $searchResults.= "<li><a href=\"/$dirs{$table}/$entry.html\">$named{$table}{$result}{$entry}</a></li>\n"; } $done{$table}{$entry} = 1; } } $searchResults.="</ul>"; } $searchResults.="<hr><h3>Further matches</h3>" if ($searchResults && %results); foreach $table (sort keys %results){ $searchResults.="<h4>". $areas{$table} ."s</h4><ul class=\"small\">\n"; foreach $result (sort keys %{$results{$table}}){ foreach $entry (keys %{$results{$table}{$result}}){ if ($table eq 'moral'){ my $info = $ybg->get_where($table, [area, section], "refno = '$entry'"); my $letter = $moralsections{$info->{$entry}{'section'}}; $letter =~ s/^([A-E])\..+/\1/o; $searchResults.= "<li><a href=\"/$dirs{$table}/$info->{$entry}{'area'}$letter.html#$entry\">$results{$table}{$result}{$entry}</a></li>\n" unless $done{$table}{$entry}; } else { $searchResults.="<li><a href=\"/$dirs{$table}/$entry.html\">$results{$table}{$result}{$entry}</a></li>\n" unless $done{$table}{$entry}; } $done{$table}{$entry} = 1; } } $searchResults.="</ul>"; } print ($searchResults ? $searchResults : "Sorry, there were no matches for your search terms<br>\n") if ($in{'submit'}); print "</div></div>\n\n$footer"; ########################################################################################## ## ## On one side, the flow-control, on the other, the subroutines... That's the way it goes down... ## ########################################################################################## sub searchSite(){ my @terms = (@_); foreach $term (@terms){ ## $results.= "Doing $term<br>"; foreach $table (@tables){ my $results = $ybg->get_where($table, [$fields{$table}{key}], "$fields{$table}{key} ~* '$term'"); foreach $res (keys %$results){ $named{$table}{$term}{$res} = "$results->{$res}{$fields{$table}{key}}"; } my $other_where = join " ~* ' $term ' OR ", split /, /, $fields{$table}{extra}; $other_where.=" ~* ' $term '"; my $other_results = $ybg->get_where($table, [$fields{$table}{key}], "$other_where"); foreach $res (keys %$other_results){ $results{$table}{$term}{$res} = "$other_results->{$res}{$fields{$table}{key}}"; } } } return \%named, \%results; } sub oddly(){ $results{$b}->{count} <=> $results{$a}->{count} || $results{$a}->{num} <=> $results{$b}->{num} || $a cmp $b; } sub form(){ foreach $table qw(theol plays gloss key moral){ $boxes.="<input type=\"checkbox\" name=\"$table\" value=\"1\">$areas{$table}s     <wbr>"; } $boxes=~s/Area of Moral Challenges/Areas of Moral Challenge/o; foreach $table (@tables){ $boxes=~s/(name="$table" value="1")/$& checked/; } ($form.=<<FORM) =~ s/\s*(.+\n)/$1/gm; <form method="post" action="/cgi-bin/cgi/search" style="text-align: left;"> <input type="hidden" name="submit" value="1"> <input type="text" name="string" style="width: 100%;" value='$in{'string'}'><br> <div style="float: right; "><input type="submit" name="guff" value=" Submit "></div> <div style="width: auto;"><nobr>$boxes</nobr></div> </form><hr> FORM return $form; }