--- loncom/homework/radiobuttonresponse.pm 2007/03/27 19:20:49 1.113 +++ loncom/homework/radiobuttonresponse.pm 2007/06/20 22:50:27 1.119 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # mutliple choice style responses # -# $Id: radiobuttonresponse.pm,v 1.113 2007/03/27 19:20:49 albertel Exp $ +# $Id: radiobuttonresponse.pm,v 1.119 2007/06/20 22:50:27 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -31,6 +31,9 @@ use strict; use HTML::Entities(); use Apache::lonlocal; use Apache::lonnet; +use Apache::response; + +my $bubbles_per_line = 10; BEGIN { &Apache::lonxml::register('Apache::radiobuttonresponse',('radiobuttonresponse')); @@ -39,6 +42,7 @@ BEGIN { sub start_radiobuttonresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; + #when in a radiobutton response use these &Apache::lonxml::register('Apache::radiobuttonresponse',('foilgroup','foil','conceptgroup')); push (@Apache::lonxml::namespace,'radiobuttonresponse'); @@ -142,11 +146,26 @@ sub grade_response { my ($answer,@whichfoils)=&whichfoils($max,$randomize); if ( !&Apache::response::submitted() ) { return; } my $response; + + # Need to know how many foils we have so that I know how many + # bubble lines to consume: + + my $numfoils = scalar(@whichfoils); + my $bubble_lines = int($numfoils / $bubbles_per_line); + if (($numfoils % $bubbles_per_line) != 0) { + $bubble_lines++; # Partial line of bubbles too. + } + + if ($env{'form.submitted'} eq 'scantron') { - $response=&Apache::response::getresponse(); + $response = &Apache::response::getresponse(1,undef,$bubble_lines, + $bubbles_per_line); + } else { $response = $env{'form.HWVAL_'.$Apache::inputtags::response['-1']}; } + &Apache::lonxml::increment_counter($bubble_lines-1); + if ( $response !~ /[0-9]+/) { return; } my $part=$Apache::inputtags::part; my $id = $Apache::inputtags::response['-1']; @@ -180,9 +199,6 @@ sub end_foilgroup { if ( $style eq 'survey' && $target ne 'analyze') { if ($target eq 'web' || $target eq 'tex') { $result=&displayallfoils($direction, $target); - if ($target eq 'web') { - &setup_prior_tries_hash(); - } } elsif ( $target eq 'answer' ) { $result=&displayallanswers(); } elsif ( $target eq 'grade' ) { @@ -196,9 +212,6 @@ sub end_foilgroup { $safeeval,'-2'); if ($target eq 'web' || $target eq 'tex') { $result=&displayfoils($target,$max,$randomize,$direction); - if ($target eq 'web') { - &setup_prior_tries_hash(); - } } elsif ($target eq 'answer' ) { $result=&displayanswers($max,$randomize); } elsif ( $target eq 'grade') { @@ -214,6 +227,11 @@ sub end_foilgroup { } $Apache::lonxml::post_evaluate=0; } + if ($target eq 'web') { + &Apache::response::setup_prior_tries_hash(\&format_prior_answer, + [\%Apache::response::foilgroup]); + } + &Apache::response::poprandomnumber(); &Apache::lonxml::increment_counter(); return $result; @@ -237,18 +255,14 @@ sub getfoilcounts { return ($truecnt,$falsecnt); } -sub setup_prior_tries_hash { - my $part=$Apache::inputtags::part; - my $id=$Apache::inputtags::response[-1]; - foreach my $i (1..$Apache::lonhomework::history{'version'}) { - my $key = "$i:resource.$part.$id.submission"; - next if (!exists($Apache::lonhomework::history{"$key"})); - my %response = - &Apache::lonnet::str2hash($Apache::lonhomework::history{$key}); - my ($name) = keys(%response); - $Apache::inputtags::submission_display{$key} = - $Apache::response::foilgroup{$name.'.text'} - } +sub format_prior_answer { + my ($mode,$answer,$other_data) = @_; + my $foil_data = $other_data->[0]; + my %response = &Apache::lonnet::str2hash($answer); + my ($name) = keys(%response); + return ''. + $foil_data->{$name.'.text'}.''; + } sub displayallfoils { @@ -514,6 +528,7 @@ sub displayfoils { } else { my @alphabet = ('A'..'Z'); my $i = 0; + my $bubble_number = 0; my $temp=0; my $id=$Apache::inputtags::response['-1']; my $part=$Apache::inputtags::part; @@ -543,6 +558,13 @@ sub displayfoils { if ($Apache::lonhomework::type eq 'exam') { $result .= '{\small \textbf{'.$alphabet[$i].'}}$\bigcirc$'.$Apache::response::foilgroup{$name.'.text'}.'\\\\'; #' stupid emacs $i++; + $bubble_number++; + if($bubble_number >= $bubbles_per_line) { + $i = 0; + $bubble_number = 0; + &Apache::lonxml::increment_counter(1); + $result.='\item[\textbf{'.$Apache::lonxml::counter.'}.]'; + } } else { $result .= '\vspace*{-2 mm}\item '.$Apache::response::foilgroup{$name.'.text'}; }