--- loncom/homework/caparesponse/caparesponse.pm 2012/02/01 17:35:24 1.250
+++ loncom/homework/caparesponse/caparesponse.pm 2014/12/30 20:03:15 1.255
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# caparesponse definition
#
-# $Id: caparesponse.pm,v 1.250 2012/02/01 17:35:24 www Exp $
+# $Id: caparesponse.pm,v 1.255 2014/12/30 20:03:15 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,6 +36,7 @@ use Apache::lonnet;
use Apache::lonmsg();
use Apache::response();
use Storable qw(dclone);
+use Apache::lonnet;
BEGIN {
&Apache::lonxml::register('Apache::caparesponse',('numericalresponse','stringresponse','formularesponse'));
@@ -43,6 +44,8 @@ BEGIN {
my %answer;
my @answers;
+my @alphabet=('A'..'Z');
+
sub get_answer { return %answer; };
sub push_answer{ push(@answers,dclone(\%answer)); undef(%answer) }
sub pop_answer { %answer = %{pop(@answers)}; };
@@ -453,7 +456,6 @@ sub check_submission {
my ($result,@msgs) =
&Apache::run::run("&caparesponse_check_list()",$safeeval);
&Apache::lonxml::debug("checking $name $result with $response took ".&Time::HiRes::tv_interval($t0));
-
&Apache::lonxml::debug('msgs are '.join(':',@msgs));
my ($awards)=split(/:/,$result);
my @awards= split(/,/,$awards);
@@ -611,7 +613,6 @@ sub end_numericalresponse {
my $number_of_bubbles = scalar(@{ $bubble_values });
my $unit=&Apache::lonxml::get_param_var('unit',$parstack,
$safeeval);
- my @alphabet=('A'..'Z');
if ($target eq 'web') {
if ($tag eq 'numericalresponse') {
if ($unit=~/\S/) {$result.=' (in '.$unit.')
';}
@@ -634,32 +635,8 @@ sub end_numericalresponse {
$result.=' \textit{(in} \verb|'.$unit.'|\textit{)} ';
}
if ($tag eq 'numericalresponse') {
- my ($celllength,$number_of_tables,@table_range)=
- &get_table_sizes($number_of_bubbles,$bubble_display);
- my $j=0;
- my $cou=0;
- $result.='\vskip 2mm \noindent ';
- $result .= '\textbf{'.$Apache::lonxml::counter.'.} \vskip -3mm ';
-
- for (my $i=0;$i<$number_of_tables;$i++) {
- if ($i == 0) {
- $result .= '\vskip -1mm ';
- } else {
- $result .= '\vskip 1mm ';
- }
- $result.='\noindent \setlength{\tabcolsep}{2 mm}\hskip 2pc\begin{tabular}{';
- for (my $ind=0;$ind<$table_range[$j];$ind++) {
- $result.='p{3 mm}p{'.$celllength.' mm}';
- }
- $result.='}';
- for (my $ind=$cou;$ind<$cou+$table_range[$j];$ind++) {
- $result.='\hskip -4 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$ & \hskip -3 mm {\small '.$bubble_display->[$ind].'} ';
- if ($ind != $cou+$table_range[$j]-1) {$result.=' & ';}
- }
- $cou += $table_range[$j];
- $j++;
- $result.='\\\\\end{tabular}\vskip 0 mm ';
- }
+ $result .= &make_horizontal_latex_bubbles($bubble_values, $bubble_display,
+ '$\bigcirc$');
} else {
$increment = &Apache::response::repetition();
}
@@ -668,7 +645,7 @@ sub end_numericalresponse {
if (($target eq 'web') && ($tag eq 'formularesponse')
&& ($Apache::lonhomework::type ne 'exam') && ($Apache::inputtags::status['-1'] eq 'CAN_ANSWER')
&& (&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffeditor') ne 'yes')) {
- $result.=&Apache::response::edit_mathresponse_button($id,"HWVAL_$id");
+ $result.=&Apache::response::edit_mathresponse_button($partid,$id);
}
&Apache::response::setup_prior_tries_hash(\&format_prior_response_numerical);
@@ -992,6 +969,15 @@ sub make_numerical_bubbles {
my $number_of_bubbles =
&Apache::response::get_response_param($part.'_'.$id,'numbubbles',8);
+ #
+ # Fixes for BZ 6519 - number of bubbles <= 0 or non-integer.
+ #
+ $number_of_bubbles = int($number_of_bubbles + 0.5);
+ if ($number_of_bubbles <= 0) {
+ $number_of_bubbles = 8;
+ }
+
+
my ($format)=&Apache::lonxml::get_param_var('format',$parstack,$safeeval);
my $name = (exists($answer{$tag_internal_answer_name})
? $tag_internal_answer_name
@@ -1079,6 +1065,64 @@ sub make_numerical_bubbles {
return (\@bubble_values,\@bubble_display,$correct);
}
+##
+# Produce LaTeX bubbles laid out horizontally given a set of bubble values:
+#
+# @param bubble_values - reference to an array of bubble 'values'
+# @param bubble_display - reference to the array of texts to display to the user
+# for each bubble_value (this is mostly for numerical response
+# when the displayed value may not be an exact
+# representation of the bubble value.
+# @param bubble_fragment- The LaTeX fragment that will be plugged in to make
+# the bubble itself. Note that the code will autonomously
+# label each bubble with a lable...and that it's perfectly
+# acceptable to use "" for the bubble_fragment.
+#
+# @return string - the LaTeX fragment that produces the bubbles.
+#
+sub make_horizontal_latex_bubbles {
+ my ($bubble_values, $bubble_display, $bubble_fragment) = @_;
+ my $result;
+
+ my $number_of_bubbles = scalar(@{$bubble_values});
+
+ # Get the number of rows and columns in each row of the bubble
+ # table:
+
+ my ($celllength, $number_of_tables, @table_range) =
+ &get_table_sizes($number_of_bubbles, $bubble_display);
+
+ my $j=0;
+ my $cou=0;
+ $result.='\vskip 2mm \noindent ';
+ $result .= '\textbf{'.$Apache::lonxml::counter.'.} \vskip -3mm ';
+
+ for (my $i=0;$i<$number_of_tables;$i++) {
+ if ($i == 0) {
+ $result .= '\vskip -1mm ';
+ } else {
+ $result .= '\vskip 1mm ';
+ }
+ $result.='\noindent \setlength{\tabcolsep}{2 mm}\hskip 2pc\begin{tabular}{';
+ for (my $ind=0;$ind<$table_range[$j];$ind++) {
+ $result.='p{4 mm}p{'.$celllength.' mm}';
+ }
+ $result.='}';
+ for (my $ind=$cou;$ind<$cou+$table_range[$j];$ind++) {
+ $result.='\hskip -4 mm {\small \textbf{ '.$alphabet[$ind].'}}'
+ . $bubble_fragment
+ . '& \hskip -3 mm {\small '.$bubble_display->[$ind].'} ';
+ if ($ind != $cou+$table_range[$j]-1) {
+ $result.=' & ';
+ }
+ }
+ $cou += $table_range[$j];
+ $j++;
+ $result.='\\\\\end{tabular}\vskip 0 mm ';
+ }
+ return $result;
+}
+
sub get_tolrange {
my ($ans,$tol)=@_;
my ($high,$low);