--- loncom/homework/radiobuttonresponse.pm 2003/04/07 22:28:08 1.67 +++ loncom/homework/radiobuttonresponse.pm 2003/10/27 18:26:15 1.77 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # mutliple choice style responses # -# $Id: radiobuttonresponse.pm,v 1.67 2003/04/07 22:28:08 albertel Exp $ +# $Id: radiobuttonresponse.pm,v 1.77 2003/10/27 18:26:15 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -62,7 +62,20 @@ sub start_radiobuttonresponse { $safeeval,'max','randomize'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } } elsif ($target eq 'tex') { + my $type=&Apache::lonxml::get_param('TeXtype',$parstack,$safeeval,undef,0); + if ($type eq '1') { + $result .= ' \renewcommand{\labelenumi}{\arabic{enumi}.}'; + } elsif ($type eq 'A') { + $result .= ' \renewcommand{\labelenumi}{\Alph{enumi}.}'; + } elsif ($type eq 'a') { + $result .= ' \renewcommand{\labelenumi}{\alph{enumi}.}'; + } elsif ($type eq 'i') { + $result .= ' \renewcommand{\labelenumi}{\roman{enumi}.}'; + } $result .= '\begin{enumerate}'; + } elsif ($target eq 'analyze') { + my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]"; + push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); } return $result; } @@ -93,7 +106,7 @@ sub start_foilgroup { sub storesurvey { if ( !defined($ENV{'form.submitted'})) { return ''; } - my $response = $ENV{'form.HWVAL'.$Apache::inputtags::response['-1']}; + my $response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1']}; &Apache::lonxml::debug("Here I am!:$response:"); if ( $response !~ /[0-9]+/) { return ''; } my $id = $Apache::inputtags::response['-1']; @@ -113,14 +126,9 @@ sub grade_response { if (!defined($ENV{'form.submitted'})) { return; } my $response; if ($ENV{'form.submitted'} eq 'scantron') { - my %let_to_num=('A'=>0,'B'=>1,'C'=>2,'D'=>3,'E'=>4,'F'=>5,'G'=>6, - 'H'=>7,'I'=>8,'J'=>9,'K'=>10,'L'=>11,'M'=>12,'N'=>13, - 'O'=>14,'P'=>15,'Q'=>16,'R'=>17,'S'=>18,'T'=>19,'U'=>20, - 'V'=>21,'W'=>22,'X'=>23,'Y'=>24,'Z'=>25); - $response = $ENV{'scantron.'.$Apache::lonxml::counter.'.answer'}; - $response = $let_to_num{$response}; + $response=&Apache::response::getresponse(); } else { - $response = $ENV{'form.HWVAL'.$Apache::inputtags::response['-1']}; + $response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1']}; } if ( $response !~ /[0-9]+/) { return; } my $part=$Apache::inputtags::part; @@ -147,9 +155,9 @@ sub end_foilgroup { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; - if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex') { + if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') { my $style = $Apache::lonhomework::type; - if ( $style eq 'survey' ) { + if ( $style eq 'survey' && $target ne 'analyze') { if ($target eq 'web' || $target eq 'answer' || $target eq 'tex') { $result=&displayallfoils(); } elsif ( $target eq 'grade' ) { @@ -166,6 +174,17 @@ sub end_foilgroup { $result=&displayanswers($max,$randomize); } elsif ( $target eq 'grade') { &grade_response($max,$randomize); + } elsif ( $target eq 'analyze') { + my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]"; + foreach my $name (@{ $Apache::response::foilgroup{'names'} }) { + if (defined($Apache::lonhomework::analyze{"$part_id.foil.value.$name"})) { next; } + push (@{ $Apache::lonhomework::analyze{"$part_id.foils"} },$name); + $Apache::lonhomework::analyze{"$part_id.foil.value.$name"} = + $Apache::response::foilgroup{"$name.value"}; + $Apache::lonhomework::analyze{"$part_id.foil.text.$name"} = + $Apache::response::foilgroup{"$name.text"}; + } + push (@{ $Apache::lonhomework::analyze{"$part_id.shown"} },&whichfoils($max,$randomize)); } } } @@ -200,7 +219,7 @@ sub displayallfoils { my $part=$Apache::inputtags::part; my $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"}; my %lastresponse=&Apache::lonnet::str2hash($lastresponse); - if (($Apache::lonhomework::history{"resource.$part.solved"} =~ /^correct/) || ($Apache::inputtags::status[-1] eq 'SHOW_ANSWER')) { + if (&Apache::response::show_answer() ) { foreach my $name (@names) { if ($Apache::response::foilgroup{$name.'.value'} ne 'unused') { $result.="
".$Apache::response::foilgroup{$name.'.value'}; @@ -216,7 +235,7 @@ sub displayallfoils { } else { foreach my $name (@names) { if ($Apache::response::foilgroup{$name.'.value'} ne 'unused') { - $result.="
\n"; $temp++; @@ -286,13 +305,16 @@ sub whichfoils { } } #pick a true statement + my $notrue=0; + if (scalar(@truelist) == 0) { $notrue=1; } my $whichtrue = int(&Math::Random::random_uniform() * ($#truelist+1)); &Apache::lonxml::debug("Max is $max, From $#truelist elms, picking $whichtrue"); my (@toplist, @bottomlist); my $topcount=0; + my $bottomcount=0; # assign everyone to either toplist/bottomlist or whichfalse # which false is randomized, toplist bottomlist are in order - while ((($#whichfalse) < $max-2) && ($#falselist > -1)) { + while ((($#whichfalse+$topcount+$bottomcount) < $max-2) && ($#falselist > -1)) { &Apache::lonxml::debug("Have $#whichfalse max is $max"); my $afalse=int(&Math::Random::random_uniform() * ($#falselist+1)); &Apache::lonxml::debug("From $#falselist elms, picking $afalse"); @@ -305,14 +327,20 @@ sub whichfoils { $topcount++; } elsif ($bottom{$afalse}) { $bottomlist[$bottom{$afalse}]=$afalse; + $bottomcount++; } else { push (@whichfalse,$afalse); } } + &Apache::lonxml::debug("Answer wants $answer"); my $truename=$truelist[$whichtrue]; my $dosplice=1; + if ($notrue) { + $dosplice=0; + &Apache::lonxml::error("There are no true statements available.
"); + } #insert the true statement, keeping track of where it wants to be - if ($Apache::response::foilgroup{$truename.'.location'} eq 'top' ) { + if ($Apache::response::foilgroup{$truename.'.location'} eq 'top' && $dosplice) { $toplist[$top{$truename}]=$truename; $answer=-1; foreach my $top (reverse(@toplist)) { @@ -320,7 +348,7 @@ sub whichfoils { if ($top eq $truename) { last; } } $dosplice=0; - } elsif ($Apache::response::foilgroup{$truename.'.location'} eq 'bottom') { + } elsif ($Apache::response::foilgroup{$truename.'.location'} eq 'bottom' && $dosplice) { $bottomlist[$bottom{$truename}]=$truename; $answer=-1; foreach my $bot (@bottomlist) { @@ -330,11 +358,12 @@ sub whichfoils { $answer+=$topcount+$#whichfalse+1; $dosplice=0; } else { - if ($topcount>0) { - $answer = int(&Math::Random::random_uniform() * ($#whichfalse+1)) - + $topcount; + if ($topcount>0 || $bottomcount>0) { + $answer = int(&Math::Random::random_uniform() * ($#whichfalse+1)) + + $topcount; } } + &Apache::lonxml::debug("Answer now wants $answer"); #add the top items to the top, bottom items to the bottom for (my $i=0;$i<=$#toplist;$i++) { if ($toplist[$i]) { unshift(@whichfalse,$toplist[$i]) } @@ -356,9 +385,8 @@ sub displayfoils { my ($answer,@whichfoils)=&whichfoils($max,$randomize); my $part=$Apache::inputtags::part; my $solved=$Apache::lonhomework::history{"resource.$part.solved"}; - my $status=$Apache::inputtags::status[-1]; if ( ($target ne 'tex') && - (($solved =~ /^correct/) || ($status eq 'SHOW_ANSWER')) ) { + &Apache::response::show_answer() ) { foreach my $name (@whichfoils) { if ($target ne 'tex') { $result.="
"; @@ -389,7 +417,7 @@ sub displayfoils { my %lastresponse=&Apache::lonnet::str2hash($lastresponse); foreach my $name (@whichfoils) { if ($target ne 'tex') { - $result.="
\n"; } else { @@ -440,7 +468,7 @@ sub end_conceptgroup { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; $Apache::radiobuttonresponse::conceptgroup=0; my $result; - if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') { + if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') { if (defined(@{ $Apache::response::conceptgroup{'names'} })) { my @names = @{ $Apache::response::conceptgroup{'names'} }; my $pick=int(&Math::Random::random_uniform() * ($#names+1)); @@ -456,6 +484,22 @@ sub end_conceptgroup { push(@{ $Apache::hint::radiobutton{"$part_id.concepts"} },$concept); $Apache::hint::radiobutton{"$part_id.concept.$concept"}= $Apache::response::conceptgroup{'names'}; + if ($target eq 'analyze') { + push (@{ $Apache::lonhomework::analyze{"$part_id.concepts"} }, + $concept); + $Apache::lonhomework::analyze{"$part_id.concept.$concept"}= + $Apache::response::conceptgroup{'names'}; + foreach my $name (@{ $Apache::response::conceptgroup{'names'} }) { + push (@{ $Apache::lonhomework::analyze{"$part_id.foils"} }, + $name); + $Apache::lonhomework::analyze{"$part_id.foil.value.$name"} = + $Apache::response::conceptgroup{"$name.value"}; + $Apache::lonhomework::analyze{"$part_id.foil.text.$name"} = + $Apache::response::conceptgroup{"$name.text"}; + $Apache::lonhomework::analyze{"$part_id.foil.location.$name"} = + $Apache::response::conceptgroup{"$name.location"}; + } + } } } elsif ($target eq 'edit') { $result=&Apache::edit::end_table(); @@ -471,7 +515,7 @@ sub insert_conceptgroup { sub start_foil { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web' || $target eq 'tex') { + if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { &Apache::lonxml::startredirection; } elsif ($target eq 'edit') { $result=&Apache::edit::tag_start($target,$token); @@ -496,8 +540,10 @@ sub start_foil { sub end_foil { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $text=''; - if ($target eq 'web' || $target eq 'tex') { $text=&Apache::lonxml::endredirection; } - if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') { + if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { + $text=&Apache::lonxml::endredirection; + } + if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') { my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval); if ($value ne 'unused') { my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);