--- loncom/homework/radiobuttonresponse.pm 2007/05/17 10:01:44 1.115 +++ loncom/homework/radiobuttonresponse.pm 2007/06/19 10:00:23 1.116 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # mutliple choice style responses # -# $Id: radiobuttonresponse.pm,v 1.115 2007/05/17 10:01:44 foxr Exp $ +# $Id: radiobuttonresponse.pm,v 1.116 2007/06/19 10:00:23 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -33,6 +33,8 @@ use Apache::lonlocal; use Apache::lonnet; use Apache::response; +my $bubbles_per_line = 10; + BEGIN { &Apache::lonxml::register('Apache::radiobuttonresponse',('radiobuttonresponse')); } @@ -40,14 +42,7 @@ BEGIN { sub start_radiobuttonresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; - #----- test/debugging to figure out some crap - - my $partid = $Apache::inputtags::part; - &Apache::lonnet::logthis("Part id = $partid"); - my $bubble_max = &Apache::response::get_response_param($partid, 'numbubbles', 10); - &Apache::lonnet::logthis("numbubbles [10] = $bubble_max"); - #----- End test/debugging #when in a radiobutton response use these &Apache::lonxml::register('Apache::radiobuttonresponse',('foilgroup','foil','conceptgroup')); push (@Apache::lonxml::namespace,'radiobuttonresponse'); @@ -152,7 +147,56 @@ sub grade_response { if ( !&Apache::response::submitted() ) { return; } my $response; if ($env{'form.submitted'} eq 'scantron') { - $response=&Apache::response::getresponse(); + # 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. + } + # Get an array of the lines... note offsets seem to go from 1??... + + my @responses; + for (my $i = 1; $i <= $bubble_lines; $i++) { + my $this_line = &Apache::response::getresponse($i); + push(@responses, $this_line); + + } + # Update the lonxml::counter so that the next problem + # Gets the right set of answers: + + &Apache::lonxml::increment_counter($bubble_lines-1); + + # This code assumes that unbubbled lines will be + # blank while bubbled lines nonblank. + # .. multiple answers awards the student 'INCORRECT'. + # This is done by setting resopnse to "Multiple" which will + # not match anything. + #.. otherwise response is set to the line*$bubble_per_line+answer + # + # --- note: + # If it is not possible to do double bubble detection + # easily in grades.pm separating this loop makes it pretty + # easy to do it here. + # Just count the number of non-blank entries, and + # below the loop, check for non-blank entries != 1 + # and report a wrong answer if so. + # + my $answer_line; + my $answer_value = ''; # By default no answer given... + my $num_bubbled_lines=0; + for (my $line_number = 0; $line_number < $bubble_lines; $line_number++) { + if ($responses[$line_number] ne "") { + $answer_line = $line_number; + $answer_value = $responses[$line_number]; + last; + } + } + + $response = $answer_line * $bubbles_per_line + $answer_value; + + } else { $response = $env{'form.HWVAL_'.$Apache::inputtags::response['-1']}; } @@ -518,6 +562,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; @@ -547,6 +592,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'}; }