--- loncom/homework/optionresponse.pm 2002/10/25 18:42:59 1.55
+++ loncom/homework/optionresponse.pm 2003/09/22 20:49:01 1.86
@@ -1,7 +1,7 @@
# LearningOnline Network with CAPA
# option list style responses
#
-# $Id: optionresponse.pm,v 1.55 2002/10/25 18:42:59 sakharuk Exp $
+# $Id: optionresponse.pm,v 1.86 2003/09/22 20:49:01 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -42,6 +42,7 @@ sub start_optionresponse {
&Apache::lonxml::register('Apache::optionresponse',('foilgroup','foil','conceptgroup'));
push (@Apache::lonxml::namespace,'optionresponse');
my $id = &Apache::response::start_response($parstack,$safeeval);
+ %Apache::hint::option=();
if ($target eq 'edit') {
$result.=&Apache::edit::start_table($token).
"
Multiple Option Response Question | Delete:".
@@ -140,7 +141,7 @@ ENDTABLE
$result.=')">';
} # else nothing changed so just use the default mechanism
}
- if ($target eq 'tex') {
+ if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {
$result .= ' \begin{enumerate} ';
}
return $result;
@@ -151,9 +152,11 @@ sub end_foilgroup {
my $result;
if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') {
+ my $tex_option_switch=&Apache::lonxml::get_param('texoptions',$parstack,$safeeval);
my $name;
my @opt;
eval '@opt ='.&Apache::lonxml::get_param('options',$parstack,$safeeval);
+ if ($target eq 'tex' && $tex_option_switch eq 'nochoice') {@opt=();}
&Apache::lonxml::debug("Options are $#opt");
my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2');
my $randomize = &Apache::lonxml::get_param('randomize',$parstack,
@@ -179,16 +182,24 @@ sub end_foilgroup {
my @whichopt = &whichfoils($max,$randomize);
my $temp=1;my $name;
my %responsehash;
+ my %grade;
my $right=0;
my $wrong=0;
my $ignored=0;
foreach $name (@whichopt) {
- my $response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1'].":$temp"};
+ my $response=&Apache::response::getresponse($temp);
+ if ($ENV{'form.submitted'} eq 'scantron') {
+ $response = $opt[$response];
+ }
$responsehash{$name}=$response;
if ( $response =~ /[^\s]/) {
my $value=$Apache::response::foilgroup{$name.'.value'};
&Apache::lonxml::debug("submitted a $response for $value \n");
- if ($value eq $response) {$right++;} else {$wrong++;}
+ if ($value eq $response) {
+ $grade{$name}='1'; $right++;
+ } else {
+ $grade{$name}='0'; $wrong++;
+ }
} else {
$ignored++;
}
@@ -197,32 +208,51 @@ sub end_foilgroup {
my $part=$Apache::inputtags::part;
my $id = $Apache::inputtags::response['-1'];
my $responsestr=&Apache::lonnet::hash2str(%responsehash);
+ my $gradestr =&Apache::lonnet::hash2str(%grade);
my %previous=&Apache::response::check_for_previous($responsestr,
$part,$id);
&Apache::lonxml::debug("Got $right right and $wrong wrong, and $ignored were ignored");
- my $ad;
- if ($wrong==0 && $ignored==0) {
- $ad='EXACT_ANS';
- } elsif ($wrong==0 && $right==0) {
- #nothing submitted
+ $Apache::lonhomework::results{"resource.$part.$id.submission"}=
+ $responsestr;
+ $Apache::lonhomework::results{"resource.$part.$id.submissiongrading"}=$gradestr;
+
+ if (!$Apache::lonhomework::scantronmode) {
+ my $ad;
+ if ($wrong==0 && $ignored==0) {
+ $ad='EXACT_ANS';
+ } elsif ($wrong==0 && $right==0) {
+ #nothing submitted
+ } else {
+ if ($ignored==0) {
+ $ad='INCORRECT';
+ } else {
+ $ad='MISSING_ANSWER';
+ }
+ }
+ $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
+ &Apache::response::handle_previous(\%previous,$ad);
} else {
- if ($ignored==0) {
- $ad='INCORRECT';
- } else {
- $ad='MISSING_ANSWER';
- }
+ my $ad;
+ if ($wrong==0 && $right==0) {
+ #nothing submitted
+ } else {
+ $ad='ASSIGNED_SCORE';
+ }
+ $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
+ $Apache::lonhomework::results{"resource.$part.$id.awarded"}=
+ $right/(scalar(@whichopt));
+ $Apache::lonhomework::results{"resource.$part.$id.numfoils"}=
+ scalar(@whichopt);
}
- $Apache::lonhomework::results{"resource.$part.$id.submission"}=
- $responsestr;
- $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=
- $ad;
- &Apache::response::handle_previous(\%previous,$ad);
}
}
+ &Apache::lonxml::increment_counter(&getfoilcounts($max));
} elsif ($target eq 'edit') {
$result.=&Apache::edit::end_table();
- }
- if ($target eq 'tex') {$result .= '\end{enumerate}';}
+ }
+ if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {
+ $result .= '\end{enumerate}';
+ }
return $result;
}
@@ -237,55 +267,15 @@ sub getfoilcounts {
}
sub whichfoils {
- my ($max,$randomize)=@_;
- $max = &getfoilcounts($max);
- &Apache::lonxml::debug("randomize $randomize");
- my @names = @{ $Apache::response::foilgroup{'names'} };
- my @whichopt =();
- my (%top,@toplist,%bottom,@bottomlist);
- if (!(&Apache::response::showallfoils() || ($randomize eq 'no'))) {
- my $current=0;
- foreach my $name (@names) {
- $current++;
- if ($Apache::response::foilgroup{$name.'.location'} eq 'top') {
- $top{$name}=$current;
- } elsif ($Apache::response::foilgroup{$name.'.location'} eq
- 'bottom') {
- $bottom{$name}=$current;
- }
- }
- }
- while ((($#whichopt+1) < $max) && ($#names > -1)) {
- &Apache::lonxml::debug("Have $#whichopt max is $max");
- my $aopt;
- if (&Apache::response::showallfoils() || ($randomize eq 'no')) {
- $aopt=0;
- } else {
- $aopt=int(&Math::Random::random_uniform() * ($#names+1));
- }
- &Apache::lonxml::debug("From $#whichopt $max $#names elms, picking $aopt");
- $aopt=splice(@names,$aopt,1);
- &Apache::lonxml::debug("Picked $aopt");
- if ($top{$aopt}) {
- $toplist[$top{$aopt}]=$aopt;
- } elsif ($bottom{$aopt}) {
- $bottomlist[$bottom{$aopt}]=$aopt;
- } else {
- push (@whichopt,$aopt);
- }
- }
- for (my $i=0;$i<=$#toplist;$i++) {
- if ($toplist[$i]) { unshift(@whichopt,$toplist[$i]) }
- }
- for (my $i=0;$i<=$#bottomlist;$i++) {
- if ($bottomlist[$i]) { push(@whichopt,$bottomlist[$i]) }
- }
-
- return @whichopt;
+ my ($max,$randomize)=@_;
+ return &Apache::response::whichorder($max,$randomize,
+ &Apache::response::showallfoils(),
+ \%Apache::response::foilgroup);
}
sub displayanswers {
my ($max,$randomize,@opt)=@_;
+ if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;}
my @names = @{ $Apache::response::foilgroup{'names'} };
my @whichopt = &whichfoils($max,$randomize);
my $result=&Apache::response::answer_header('optionresponse');
@@ -299,37 +289,69 @@ sub displayanswers {
sub displayfoils {
my ($target,$max,$randomize,@opt)=@_;
+ if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;}
my @names = @{ $Apache::response::foilgroup{'names'} };
my @truelist;
my @falselist;
- my $result;
+ my $result;
my $name;
my $displayoptionintex=0;
- my @alphabet = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
- 'Q','R','S','T','U','V','W','X','Y','Z');
+ my @alphabet = ('A'..'Z');
my @whichopt = &whichfoils($max,$randomize);
my $part=$Apache::inputtags::part;
my $id=$Apache::inputtags::response[-1];
- if (($Apache::lonhomework::history{"resource.$part.solved"} =~ /^correct/) || ($Apache::inputtags::status[-1] eq 'SHOW_ANSWER')) {
+ my $break;
+ my $solved=$Apache::lonhomework::history{"resource.$part.solved"};
+ my $status=$Apache::inputtags::status[-1];
+ if ( ($target ne 'tex') &&
+ &Apache::response::show_answer() ) {
foreach $name (@whichopt) {
- if ($target eq 'web') {
- $result.=" ";
+ my $text=$Apache::response::foilgroup{$name.'.text'};
+ if ($text!~/^\s*$/) {
+ if ($target eq 'tex') {
+ $break='\vskip 0 mm ';
+ } elsif ($target eq 'web') {
+ $break=' ';
+ }
+ }
+ $result.=$break;
+ if ($target eq 'web') {
+ my $value=$Apache::response::foilgroup{$name.'.value'};
+ if (!($text=~s||$value|)) {
+ if ($text=~/^\s*$/) {
+ $text=$value.$text;
+ } else {
+ $text=$value.': '.$text;
+ }
+ }
+ $result.=$text."\n";
} elsif ($target eq 'tex') {
- $result.='\vskip 0 mm ';
- }
- if ($target ne 'tex') {
- $result .=$Apache::response::foilgroup{$name.'.value'}.
- ":".$Apache::response::foilgroup{$name.'.text'}."\n";
- } else {
$Apache::response::foilgroup{$name.'.text'}=~s/\\item//;
- $result .='\item \textit{'.$Apache::response::foilgroup{$name.'.value'}.'}'.
+ if ($max>1) {$result .='\item ';}
+ $result .=' \textit{'.$Apache::response::foilgroup{$name.'.value'}.'}'.
":".$Apache::response::foilgroup{$name.'.text'}."\n";
}
+ if ($Apache::lonhomework::type eq 'exam') {
+ if ($target ne 'tex') {
+ $result.=&webbubbles(\@opt,\@alphabet);
+ } else {
+ $result.=&bubbles(\@alphabet,\@opt);
+ }
+ }
}
} else {
my $temp=1;
my %lastresponse=&Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"});
+ my $internal_counter=$Apache::lonxml::counter;
foreach $name (@whichopt) {
+ my $text=$Apache::response::foilgroup{$name.'.text'};
+ if ($text!~/^\s*$/) {
+ if ($target eq 'tex') {
+ $break='\vskip 0 mm ';
+ } elsif ($target eq 'web') {
+ $break=' ';
+ }
+ }
my $lastopt=$lastresponse{$name};
my $optionlist="\n";
my $option;
@@ -341,62 +363,71 @@ sub displayfoils {
}
}
if ($target ne 'tex') {
- $result.=" \n".$Apache::response::foilgroup{$name.'.text'}."\n";
+ if ($Apache::lonhomework::type ne 'exam') {
+ $optionlist='\n";
+ }
+ my $text=$Apache::response::foilgroup{$name.'.text'};
+ if (!($text=~s||$optionlist|) && $Apache::lonhomework::type ne 'exam') {
+ $text=$optionlist.$text;
+ }
+ $result.=$break.$text."\n";
if ($Apache::lonhomework::type eq 'exam') {
- my $number_of_bubbles = $#opt + 1;
- $result.= '';
- for (my $ind=0;$ind<$number_of_bubbles;$ind++) {
- $result.=''.$alphabet[$ind].': '.$opt[$ind].' | ';
- }
- $result.=' ';
+ $result.=&webbubbles(\@opt,\@alphabet,$temp);
}
$temp++;
} else {
+ my $texoptionlist = &optionlist_correction($optionlist);
if ($displayoptionintex == 0) {
- my $texoptionlist = &optionlist_correction($optionlist);
- if ($Apache::lonhomework::type eq 'exam') {$texoptionlist='';}
+ if ($Apache::lonhomework::type eq 'exam') {$texoptionlist='';} #if exam we do not need to show optionlist
if ($Apache::response::foilgroup{$name.'.text'}=~m/\\item /) {
- if ($Apache::lonhomework::type eq 'exam') {
- $Apache::response::foilgroup{$name.'.text'}=~s/\\item/\\item[\\textbf{$Apache::lonxml::counter}\.]/;
- }
- $result.= $texoptionlist.$Apache::response::foilgroup{$name.'.text'};
+ if ($Apache::lonhomework::type eq 'exam') {
+ $Apache::response::foilgroup{$name.'.text'}=~s/\\item/\\vskip 2 mm/;
+ }
+ if ($Apache::response::foilgroup{$name.'.text'}=~//) {
+ $Apache::response::foilgroup{$name.'.text'}=~s|| \\makebox\[0\.3in\]\[b\]\{\\hrulefill\} |;
+ }
+ $result.= $texoptionlist.$Apache::response::foilgroup{$name.'.text'};
} else {
if ($Apache::lonhomework::type eq 'exam') {
- $result.= $texoptionlist.'\item[\textbf{'.$Apache::lonxml::counter.'}.]'.$Apache::response::foilgroup{$name.'.text'};
+ $result.= $texoptionlist.' '.$Apache::response::foilgroup{$name.'.text'};
} else {
- $result.= $texoptionlist.'\item '.$Apache::response::foilgroup{$name.'.text'};
+ $result.= $texoptionlist.'\vspace*{-2 mm}\item '.$Apache::response::foilgroup{$name.'.text'};
}
}
if ($Apache::lonhomework::type eq 'exam') {
- $result.=&bubbles(\@alphabet,\@opt);
+ $result.='\vskip -2 mm\parbox{\textwidth}{\begin{enumerate}\item[\textbf{'.$internal_counter.'}.]\parbox{\textwidth - 5 mm}{'.&bubbles(\@alphabet,\@opt).'}\end{enumerate}} \vskip -9 mm \strut ';
+ $internal_counter++;
}
$displayoptionintex=1;
} else {
if ($Apache::response::foilgroup{$name.'.text'}=~m/\\item /) {
if ($Apache::lonhomework::type eq 'exam') {
- $Apache::response::foilgroup{$name.'.text'}=~s/\\item/\\item[\\textbf{$Apache::lonxml::counter}\.]/;
+ $Apache::response::foilgroup{$name.'.text'}=~s/\\item//;
}
- $result.= $Apache::response::foilgroup{$name.'.text'};
+ if ($Apache::response::foilgroup{$name.'.text'}=~//) {
+ $Apache::response::foilgroup{$name.'.text'}=~s|| \\makebox\[0\.3in\]\[b\]\{\\hrulefill\} |;
+ }
+ $result.= $Apache::response::foilgroup{$name.'.text'};
} else {
if ($Apache::lonhomework::type eq 'exam') {
- $result.= '\item[\textbf{'.$Apache::lonxml::counter.'}.]'.$Apache::response::foilgroup{$name.'.text'};
+ $result.= ' '.$Apache::response::foilgroup{$name.'.text'};
} else {
$result.= '\item '.$Apache::response::foilgroup{$name.'.text'};
}
}
if ($Apache::lonhomework::type eq 'exam') {
- $result.=&bubbles(\@alphabet,\@opt);
+ $result.='\vskip -2 mm \parbox{\textwidth}{\begin{enumerate}\item[\textbf{'.$internal_counter.'}.]\parbox{\textwidth - 5 mm}{'.&bubbles(\@alphabet,\@opt).'}\end{enumerate}} \vskip -9 mm \strut ';
+ $internal_counter++;
}
}
- }
+ }
}
- }
- if ($target ne 'tex') {
- return $result." ";
}
- else {
+ if ($target ne 'tex') {
+ return $result.$break;
+ } else {
return $result;
}
}
@@ -405,18 +436,40 @@ sub displayfoils {
sub optionlist_correction {
my $texoptionlist = shift;
- $texoptionlist =~ s/ |