#!/usr/comp/bin/perl
#
#
# Quiz.pl
# by Leif M. Wright
# http://www.conservatives.net/atheist/scripts/
# scripts@conservatives.net
#
#################################################################
# Quiz.pl is a simple little quiz script that lets you put an
# unlimited number of quizzes on your site for your users to
# take. Operation is simple.
#
# You only have to modify two variables in the script itself, and
# they are defined below in the USER CONFIGURATION section.
#
# Each quiz is a separate html document with several hidden
# inputs, some of which are required. (they're explained below)
#
# Each quiz gets its answers from a pipe-delimited database that
# looks like this:
#
# 1|yes|The answer to this question is obviously yes, you dolt
#
# The first item is the question number, which should match
# the question number in your html form. The second item is the answer
# to the question. The third item is a description that explains
# the answer to the user once they've either gotten it wrong or right.
#
# Each answer should take up one line in your answer file, which
# should end with an ".an" extension. For example, if your first
# quiz was called "FirstQuiz", the answer file would be "FirstQuiz.an"
#
# Your html form will need some hidden inputs:
#
# <input type=hidden name=Quiz value="1">
# This contains the name of the quiz (which also will correspond
# to the name of the answer database). In this case, my quiz is named
# "1" If you use numerals for your quiz names, the script has a
# nifty feature that looks for the next quiz (in this case it would
# be quiz number 2. If that quiz exists, the script will provide a
# link to it. If it doesn't exist, the script will provide a link to home.
#
# <input type=hidden name=QuestionCount value="10">
# This contains the number of questions in the quiz. It allows the
# script to count the number of questions that should be answered, and
# inform the user if they didn't answer all the questions
#
# <input type=hidden name=required value="1|4|7">
# The character separating the numbers is a pipe (|).
# This tells the script which questions to require answers to.
# It only works on inputs of the text and select box type.You cannot
# require answers to radio box-inputs or checkbox inputs.
#
# You can put an unlimited number of questions in a quiz, just be
# sure to change the "QuestionCount" hidden input value to reflect
# the number of questions you use.
#
#################################################################
# USER CONFIGURATION SECTION
#################################################################
# This should be a web url to your home page. It SHOULD NOT contain
# a trailing slash "/".
#$baseurl = "http://www.e-bible.org";
$baseurl = "http://www.comp.polyu.edu.hk/~cstyng/cgi-bin/ic/quiz.html";
# $basedir is the UNIX directory that contains your output file. Again,
# It should point to a directory only, not a file, and it SHOULD NOT
# contain a trailing slash "/"
#$basedir = "/usr/home/leif/public_html/conservatives/atheist/scripts";
$basedir = "/home/staff/cstyng/public_html/cgi-bin/ic";
#That's it! You're done!
#################################################################
# END OF USER CONFIGURATION SECTION #
#################################################################
#reads form data
&parse;
$answersfile = "$basedir/" . "$contents_by_name{'Quiz'}" . ".an";
print "Content-type: text/html\n\n";
if ($contents_by_name{'name'} eq '') {
print "<body bgcolor=red><font color=white><h1>You must tell us your name! Please go back and try again!</h1>\n";
exit;
}
@required = split(/\|/, $contents_by_name{'required'});
foreach $required (@required) {
for ($i = 0; $i < $count; $i++)
{
if (($fieldnames{$i} eq $required) && ($contents{$i} eq '')) {
# print "Content-type: text/html\n\n";
print "<body bgcolor=white><h1>Error</h1>\n";
print "<font size=4>You must answer question number <b>$fieldnames{$i}</b>\n";
print "<br> Please go back and complete the form\n";
exit;
}
}
}
&grade;
sub grade
{
open(ANSWERS, "$answersfile");
@answers = <ANSWERS>;
close (ANSWERS);
print "<body bgcolor=white><font face=\"Verdana,Arial,Helvetica,Geneva\" size=4><h1>Score for $contents_by_name{'name'}</h1>\n";
#print OUTFILE "<HTML><BODY>";
for ($i = 0; $i < $count; $i++)
{
if (($fieldnames{$i} eq 'Quiz') || ($fieldnames{$i} eq 'QuestionCount') || ($fieldnames{$i} eq 'name') || ($fieldnames{$i} eq 'required'))
{
next;
}
&CompareAnswers;
}
#print "<hr noshade size=1>\n";
print "<hr noshade size=1>\n";
if ($rightcount + $wrongcount != $contents_by_name{'QuestionCount'}) {
$TotalAnswered = $rightcount + $wrongcount;
print "You did not answer all $contents_by_name{'QuestionCount'} questions.<Br>";
print "Of the $TotalAnswered questions you answered, you got $rightcount correct and $wrongcount incorrect.<p>";
&checkifnext;
}
print "You got <b>$rightcount</b> answers right.<br>You got <b>$wrongcount</b> answers wrong.<p>\n";
&checkifnext;
sub checkifnext {
$nextquiz = $contents_by_name{'Quiz'} +1;
$nextcomplete = "$basedir/" . "$nextquiz" . ".an";
open(NEXTER, "$nextcomplete") || &done;
close (NEXTER);
print "<a href=quiz$nextquiz.html>Take the next quiz</a>";
exit;
}
}
sub done {
print "<a href=$baseurl>Home</a>";
exit;
}
sub CompareAnswers {
foreach $answers (@answers) {
($QuestionNumber,$AnswerDetail,$AnswerExplain) = split(/\|/, $answers);
$AnswerDisplay = $AnswerDetail;
# chop($AnswerDetail);
if ($QuestionNumber eq $fieldnames{$i}) {
if ($AnswerDetail eq $contents{$i}) {
print "Your answer for question $fieldnames{$i}, <b>$contents{$i},</b> is CORRECT! <i>$AnswerExplain</i><p>\n";
$rightcount++;
} else {
print "<font color=red>Your answer for question $fieldnames{$i},</font><b> $contents{$i},</b><font color=red> is <b>WRONG!</b></font>";
print " <i><b>$AnswerExplain</b></i><p>\n";
$wrongcount++;
}
}
}
}
sub parse
{
if ($ENV{'REQUEST_METHOD'} eq 'POST')
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
$count = 0;
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$contents_by_name{$name} = $value;
$contents{$count} = $value;
$fieldnames{$count} = $name;
$count++;
}
}
}