--- loncom/homework/optionresponse.pm 2002/04/25 21:35:30 1.38 +++ loncom/homework/optionresponse.pm 2003/10/03 15:23:53 1.88 @@ -1,7 +1,7 @@ -# The LearningOnline Network with CAPA +# LearningOnline Network with CAPA # option list style responses # -# $Id: optionresponse.pm,v 1.38 2002/04/25 21:35:30 sakharuk Exp $ +# $Id: optionresponse.pm,v 1.88 2003/10/03 15:23:53 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 QuestionDelete:". @@ -50,12 +51,14 @@ sub start_optionresponse { &Apache::edit::end_row(). &Apache::edit::start_spanning_row(). "\n"; - $result.=&Apache::edit::text_arg('Max Number Of Shown Foils:','max',$token,'4'). - &Apache::edit::end_row(). - &Apache::edit::start_spanning_row(); + $result.=&Apache::edit::text_arg('Max Number Of Shown Foils:','max', + $token,'4'). + &Apache::edit::select_arg('Randomize Foil Order','randomize', + ['yes','no'],$token). + &Apache::edit::end_row().&Apache::edit::start_spanning_row(); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args($token,$parstack, - $safeeval,'max'); + $safeeval,'max','randomize'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } } elsif ($target eq 'meta') { $result=&Apache::response::meta_package_write('optionresponse'); @@ -63,7 +66,6 @@ sub start_optionresponse { my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]"; push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); } -# if ($target eq 'tex') {$result .= '\begin{enumerate}';} return $result; } @@ -74,16 +76,15 @@ sub end_optionresponse { &Apache::lonxml::deregister('Apache::optionresponse',('foilgroup','foil','conceptgroup')); my $result; if ($target eq 'edit') { $result=&Apache::edit::end_table(); } -# if ($target eq 'tex') {$result .= '\end{enumerate}';} return $result; } -%Apache::response::foilgroup={}; +%Apache::response::foilgroup=(); sub start_foilgroup { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - %Apache::response::foilgroup={}; + %Apache::response::foilgroup=(); $Apache::optionresponse::conceptgroup=0; &Apache::response::setrandomnumber(); if ($target eq 'edit') { @@ -132,7 +133,7 @@ ENDTABLE if ($optchanged) { $result = "$max) { $count=$max } - &Apache::lonxml::debug("Count is $count from $max"); 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, + $safeeval,'-2'); if ($target eq 'web' || $target eq 'tex') { - $result.=&displayfoils($target,$count,@opt); + $result.=&displayfoils($target,$max,$randomize,@opt); } elsif ( $target eq 'answer') { - $result.=&displayanswers($count,@opt); + $result.=&displayanswers($max,$randomize,@opt); } elsif ( $target eq 'analyze') { my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]"; foreach my $name (@{ $Apache::response::foilgroup{'names'} }) { @@ -171,22 +176,30 @@ sub end_foilgroup { $Apache::response::foilgroup{"$name.text"}; } push (@{ $Apache::lonhomework::analyze{"$part_id.options"} },@opt); - push (@{ $Apache::lonhomework::analyze{"$part_id.shown"} },&whichfoils($count)); + push (@{ $Apache::lonhomework::analyze{"$part_id.shown"} },&whichfoils($max,$randomize)); } elsif ( $target eq 'grade') { if ( defined $ENV{'form.submitted'}) { - my @whichopt = &whichfoils($count); + 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++; } @@ -195,62 +208,76 @@ 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; } sub getfoilcounts { - my ($parstack,$safeeval)=@_; - my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2'); + my ($max)=@_; # +1 since instructors will count from 1 my $count = $#{ $Apache::response::foilgroup{'names'} }+1; - return ($count,$max); + if (&Apache::response::showallfoils()) { $max=$count; } + if ($count>$max) { $count=$max } + &Apache::lonxml::debug("Count is $count from $max"); + return $count; } sub whichfoils { - my ($max)=@_; - my @names = @{ $Apache::response::foilgroup{'names'} }; - my @whichopt =(); - while ((($#whichopt+1) < $max) && ($#names > -1)) { - &Apache::lonxml::debug("Have $#whichopt max is $max"); - my $aopt=int(rand($#names+1)); - &Apache::lonxml::debug("From $#whichopt $max $#names elms, picking $aopt"); - $aopt=splice(@names,$aopt,1); - &Apache::lonxml::debug("Picked $aopt"); - push (@whichopt,$aopt); - } - return @whichopt; + my ($max,$randomize)=@_; + return &Apache::response::whichorder($max,$randomize, + &Apache::response::showallfoils(), + \%Apache::response::foilgroup); } sub displayanswers { - my ($max,@opt)=@_; + my ($max,$randomize,@opt)=@_; + if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;} my @names = @{ $Apache::response::foilgroup{'names'} }; - my @whichopt = &whichfoils($max); + my @whichopt = &whichfoils($max,$randomize); my $result=&Apache::response::answer_header('optionresponse'); foreach my $name (@whichopt) { $result.=&Apache::response::answer_part('optionresponse', @@ -261,30 +288,70 @@ sub displayanswers { } sub displayfoils { - my ($target,$max,@opt)=@_; + 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; - $Apache::optionresponse::displayoptionintex=0; - my @whichopt = &whichfoils($max); + my $displayoptionintex=0; + 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.='\newline'; + $Apache::response::foilgroup{$name.'.text'}=~s/\\item//; + 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); + } } - $result .=$Apache::response::foilgroup{$name.'.value'}. - ":".$Apache::response::foilgroup{$name.'.text'}."\n"; } } 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; @@ -296,38 +363,143 @@ 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') { + $result.=&webbubbles(\@opt,\@alphabet,$temp); + } $temp++; } else { - if ($Apache::optionresponse::displayoptionintex == 0) { - my $durtyoptionlist = $optionlist; - $durtyoptionlist =~ s/