################################################################################ # WeBWorK Online Homework Delivery System # Copyright © 2000-2007 The WeBWorK Project, http://openwebwork.sf.net/ # $CVSHeader$ # # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version, or (b) the "Artistic License" which comes with this package. # # 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 either the GNU General Public License or the # Artistic License for more details. ################################################################################ =head1 NAME PGmiscevaluators.pl - Some miscellaneous answer macros. =head1 SYNOPSIS =head1 DESCRIPTION Currently contains answer evaluators for radio buttons and checkboxes. =head2 MathObjects and answer evaluators The MathObjects system provides a parserRadioButtons.pl file that manages display and checking of radio-button based answers. It is recommended that you use this method directly if possible. =cut BEGIN { be_strict() } sub _PGmiscevaluators_init {} =head1 checkbox_cmp ANS(checkbox_cmp($correctAnswer)) $correctAnswer is a string containing the names of the correct boxes, e.g. "ACD". Note that this means that individual checkbox names can only be one character. Internally, this is largely the same as unordered_cs_str_cmp(). =cut # added 6/14/2000 by David Etlinger # because of the conversion of the answer # string to an array, I thought it better not # to force STR_CMP() to work with this #added 2/26/2003 by Mike Gage # handled the case where multiple answers are passed as an array reference # rather than as a \0 delimited string. sub checkbox_cmp { my $correctAnswer = shift @_; my %options = @_; assign_option_aliases( \%options, ); set_default_options( \%options, 'debug' => 0, 'type' => 'checkbox_cmp', ); my $answer_evaluator = new AnswerEvaluator( correct_ans => $correctAnswer, type => $options{type}, ); # pass along debug requests $answer_evaluator->{debug} = $options{debug}; # join student answer array into a single string if necessary $answer_evaluator->install_pre_filter(sub { my $rh_ans = shift; $rh_ans->{_filter_name} = 'convert student_ans to string'; $rh_ans->{student_ans} = join("", @{$rh_ans->{student_ans}}) if ref($rh_ans->{student_ans}) =~/ARRAY/i; $rh_ans; }); # ignore order of check boxes $answer_evaluator->install_pre_filter(\&ignore_order); # compare as strings $answer_evaluator->install_evaluator(sub { my $rh_ans = shift; $rh_ans->{_filter_name} = 'compare strings generated by checked boxes'; $rh_ans->{score} = ($rh_ans->{student_ans} eq $rh_ans->{correct_ans}) ? 1 : 0; $rh_ans; }); # fix up preview displays $answer_evaluator->install_post_filter( sub { my $rh_ans = shift; $rh_ans->{_filter_name} = 'adjust preview strings'; $rh_ans->{type} = $options{type}; $rh_ans->{preview_text_string} = '\\text{'.$rh_ans->{student_ans}.'}', $rh_ans->{preview_latex_string} = '\\text{'.$rh_ans->{student_ans}.'}', $rh_ans; }); return $answer_evaluator; } =head1 radio_cmp ANS(radio_cmp($correctAnswer)) $correctAnswer is a string containing the name of the correct radio button, e.g. "Choice1". This is case sensitive and whitespace sensitive, so the correct answer must match the name of the radio button exactly. =cut #added 6/28/2000 by David Etlinger #exactly the same as strict_str_cmp, #but more intuitive to the user # check that answer is really a string and not an array # also use ordinary string compare sub radio_cmp { #strict_str_cmp( @_ ); my $response = shift; # there should be only one item. warn "Multiple choices -- this should not happen with radio buttons. Have you used checkboxes perhaps?" if ref($response); #triggered if an ARRAY is passed str_cmp($response); } =head1 SEE ALSO L, L. =cut 1;