The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
#############################################################################
# Copyright (C) 2002, Stefano Corsi <ippo@madeinlinux.com>                  #
#                                                                           #
# This program is free software; you can redistribute it and/or modify      #
# it under the terms of the GNU General Public License as published by      #
# the Free Software Foundation; either version 2 of the License, or         #
# (at your option) any later version.                                       #
#                                                                           #
# This program is distributed in the hope that it will be useful,           #
# but WITHOUT ANY WARRANTY; without even the implied warranty of            #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             #
# GNU General Public License for more details.                              #
#                                                                           #
# You should have received a copy of the GNU General Public License         #
# along with this program; if not, write to the Free Software               #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA #
#                                                                           #
#############################################################################

use Quizzer::Template;
use Quizzer::Question;
use Quizzer::AutoSelect;
use Quizzer::Loader;

use strict;

use vars qw(%templates %questions);

### Il file dei template di Quizzer
my $TPLFILE='/etc/Quizzer.tpl';

### Prende il nome del file contenente i Quiz!
my $QUIZFILE=$ARGV[0];

### Vede se e' gia' stato configurato
### (scelta della lingua, etc...)
my $CONFIGURED=$ARGV[1];

### Se non e' stato specificato alcun file muore
($QUIZFILE) || do { 
	print STDERR "Non e' stato specificato un Quiz file...\n";
	print STDERR "**************************************************\n";
	print STDERR "E' possibile utilizzare il Quiz di esempio fornito\n";
	print STDERR "(di solito) in /usr/share/Quizzer/quiz.txt!\n";
	print STDERR "**************************************************\n";
	
	exit -1;
};

### Carica i template di base
loadtemplatefile($TPLFILE, 'quiz');

### Carica i quiz...
loadtemplatefile($QUIZFILE, 'quiz');

### Vede qual'e' il tipo di frontend
my $frontend=Quizzer::AutoSelect::frontend();

### Se e' la prima chiamata ...
if (!$CONFIGURED) {

	my $langs = {
		'Italiano' => 'it_IT',
		'Deutsch' => 'de_DE'
	};

	my $message = getquestion('lingua/scelta');	
	$frontend->add($message, 'high');
	$frontend->default_title('Scelta lingua');
	my $result = $frontend->go();

	if (!$result)  {
		exit -1;	
	}

	my $ret = $message->value();

	
	$ENV{'LANG'} = $langs->{$ret};
	exec qq{Quizzer $QUIZFILE CONFIGURED};
	exit -1;

}

### Il calcolo del punteggio
my $answers = 0;
my $correct_answers = 0;
my $uncorrect_answers = 0;

### Pone tutte le domande
my $index = 0;
while(1) {

	### Estrae una domanda dai template
	my $question = getquestion('quiz/domanda' . ++$index);	

	### Se sono finite le domande ... mostra il punteggio ed esce
	$question || do {
	
			my $message = getquestion('risultato/riassunto');	
			$message->{'variables'} = {
				'correct' => $correct_answers,
				'uncorrect' => $uncorrect_answers,
				'percent' => (100 * $correct_answers) / $answers,
			};
			$frontend->add($message, 'high');
			$frontend->default_title('Riassunto finale');
			$frontend->go();
			exit 0;
	
	};

	### Aggiunge la domanda ... se e' del livello corretto
	my $visible = $frontend->add($question, $question->level());

	### Imposta il titolo	
	$frontend->default_title('Domanda ' . $index);

	### Mostra il dialogo
	my $result = $frontend->go();

	if (!$result)  {
		exit -1;	
	}

	my $ret = undef;

	### Se e' una solo una domanda ...
	if (!$question->exercise()) {
		$ret = $question->value();
	### Se invece e' un esercizio ...
	} else {
		my $exercise = $question->exercise();
		my $dirname = `basename $exercise`;
		chop $dirname;
		$dirname =~ s/\.tar\.gz$//;

		### Scompattiamo il tar.gz
		system qq{
			rm -rf /tmp/$dirname
			cd /tmp; tar zxf $exercise
		};
	
		### Eseguiamo i comandi
		system qq{
			/tmp/$dirname/$dirname.pre 2> /dev/null 1> /dev/null
			if [ -n "\$DISPLAY" ]; then \\
				xterm -e /tmp/$dirname/$dirname.cmd ; \\
			else \\
				/tmp/$dirname/$dirname.cmd ; \\
			fi
		};

		### Eseguiamo il post per valutare il risultato
		system qq{
			/tmp/$dirname/$dirname.post 2> /dev/null 1> /dev/null
		};

		$ret = $?;	
	}

	my $answer = $question->answer();
	my $answer_description = $question->answer_description();
	my $answer2 = $question->answer2();
	my $explanation = $question->explanation();
	
	### Solo se la domanda era visibile...
	### ... ovvero se il livello era sufficientemente alto
	if ($visible) {

		### Se la risposta e' corretta ...
		if (($ret eq $answer) || ($answer2 && ($ret eq $answer2))) {
			$answers++;
			$correct_answers++;

			if ($question->exercise()) {
				my $message = getquestion('esercizio/corretto');
				$message->{'variables'} = {
					'answer' => $answer_description
				};
				$frontend->add($message, 'high');
				$frontend->default_title('Esercizio corretto');
			} else {
				my $message = getquestion('risposta/corretta');
				$message->{'variables'} = {
					'answer' => $answer_description ? 
						$answer_description  :
						($answer eq $ret ? $answer : $answer2)
				};
				$frontend->add($message, 'high');
				$frontend->default_title('Risposta corretta');
			}
			$frontend->go();
		### Altrimenti, se la risposta e' scorretta
		} else {
			$answers++;
			$uncorrect_answers++;

			if ($question->exercise()) {
				my $message = getquestion('esercizio/scorretto');
				$message->{'variables'} = {
					'answer' => $answer_description
				};
				$frontend->add($message, 'high');
				$frontend->default_title('Esercizio non corretto');
			} else {

				my $message = getquestion('risposta/scorretta');
				$message->{'variables'} = {
					'answer' => $answer_description ?
						$answer_description : $answer,	
					'explanation' => $explanation
				};
				$frontend->add($message, 'high');
				$frontend->default_title('Risposta errata');
			}
			$frontend->go();
		}
	}	

}

=head1 AUTHOR

Stefano Corsi <ippo@madeinlinux.com>

=cut

1