--- loncom/homework/caparesponse/caparesponse.pm 2020/12/04 22:19:19 1.261
+++ loncom/homework/caparesponse/caparesponse.pm 2025/02/20 06:36:00 1.266
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# caparesponse definition
#
-# $Id: caparesponse.pm,v 1.261 2020/12/04 22:19:19 raeburn Exp $
+# $Id: caparesponse.pm,v 1.266 2025/02/20 06:36:00 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -327,7 +327,17 @@ sub start_numericalresponse {
sub set_answertext {
my ($name,$target,$token,$tagstack,$parstack,$parser,$safeeval,
$response_level) = @_;
- &add_in_tag_answer($parstack,$safeeval,$response_level);
+ my $stringify;
+ if (scalar(@$tagstack)) {
+ if ($$tagstack[-1] eq 'formularesponse') {
+ if (&Apache::lonxml::get_param('samples',$parstack,$safeeval)) {
+ $stringify = 1;
+ }
+ } elsif ($$tagstack[-1] eq 'numericalresponse') {
+ $stringify = 1;
+ }
+ }
+ &add_in_tag_answer($parstack,$safeeval,$stringify,$response_level);
if ($name eq '' || !ref($answer{$name})) {
if (ref($answer{$tag_internal_answer_name})) {
@@ -401,7 +411,7 @@ sub setup_capa_response {
if (ref($response)) {
$$args_ref{'response'}=dclone($response);
} else {
- $$args_ref{'response'}=dclone([$response]);
+ $$args_ref{'response'}=dclone(["$response"]);
}
}
@@ -409,6 +419,7 @@ sub check_submission {
my ($response,$partid,$id,$tag,$parstack,$safeeval,$ignore_sig)=@_;
my @args = ('type','tol','sig','format','unit','calc','samples','preprocess');
my $args_ref = &setup_capa_args($safeeval,$parstack,\@args,$response);
+ my $stringify;
my $hideunit=
&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffunit');
@@ -428,18 +439,20 @@ sub check_submission {
if ($tag eq 'formularesponse') {
if ($$args_ref{'samples'}) {
$$args_ref{'type'}='fml';
+ $stringify = 1;
} else {
$$args_ref{'type'}='math';
}
} elsif ($tag eq 'numericalresponse') {
$$args_ref{'type'}='float';
+ $stringify = 1;
} elsif ($tag eq 'stringresponse') {
if ($$args_ref{'type'} eq '') {
$$args_ref{'type'} = 'ci';
}
}
- &add_in_tag_answer($parstack,$safeeval);
+ &add_in_tag_answer($parstack,$safeeval,$stringify);
if (!%answer) {
&Apache::lonxml::error("No answers are defined");
@@ -514,11 +527,14 @@ sub stringresponse_gradechange {
}
sub add_in_tag_answer {
- my ($parstack,$safeeval,$response_level) = @_;
+ my ($parstack,$safeeval,$stringify,$response_level) = @_;
my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval,
$response_level);
&Apache::lonxml::debug('answer is'.join(':',@answer));
if (@answer && $answer[0] =~ /\S/) {
+ if ($stringify) {
+ @answer = map { $_ .= ''; } @answer;
+ }
$answer{$tag_internal_answer_name}= {'type' => 'ordered',
'answers' => [\@answer] };
}
@@ -544,7 +560,7 @@ sub end_numericalresponse {
}
my $partid = $Apache::inputtags::part;
my $id = $Apache::inputtags::response[-1];
- my $tag;
+ my ($tag,$stringify);
my $safehole = new Safe::Hole;
$safeeval->share_from('capa',['&caparesponse_capa_check_answer']);
@@ -562,12 +578,19 @@ sub end_numericalresponse {
&Apache::lonxml::debug($$parstack[-1] . "\n
");
if ( &Apache::response::submitted('scantron')) {
- &add_in_tag_answer($parstack,$safeeval);
- my ($values,$display)=&make_numerical_bubbles($partid,$id,
- $target,$parstack,$safeeval);
- $response=$values->[$response];
- }
- $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;
+ if ($tag eq 'numericalresponse') {
+ $stringify = 1;
+ } elsif ($tag eq 'formularesponse') {
+ if (&Apache::lonxml::get_param('samples',$parstack,$safeeval)) {
+ $stringify = 1;
+ }
+ }
+ &add_in_tag_answer($parstack,$safeeval,$stringify);
+ my ($values,$display)=&make_numerical_bubbles($partid,$id,$target,
+ $parstack,$safeeval);
+ $response=$values->[$response];
+ }
+ $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;
my ($ad,$msg,$name)=&check_submission($response,$partid,$id,
$tag,$parstack,
$safeeval);
@@ -601,7 +624,14 @@ sub end_numericalresponse {
}
}
} elsif ($target eq 'web' || $target eq 'tex') {
- &check_for_answer_errors($parstack,$safeeval);
+ if ($tag eq 'numericalresponse') {
+ $stringify = 1;
+ } elsif ($tag eq 'formularesponse') {
+ if (&Apache::lonxml::get_param('samples',$parstack,$safeeval)) {
+ $stringify = 1;
+ }
+ }
+ &check_for_answer_errors($parstack,$safeeval,$stringify);
my $award = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
my $status = $Apache::inputtags::status['-1'];
if ($Apache::lonhomework::type eq 'exam') {
@@ -623,10 +653,10 @@ sub end_numericalresponse {
if ($previous eq $bubble_values->[$ind]) {
$checked=" checked='on' ";
}
- $result.='