--- loncom/homework/caparesponse/caparesponse.pm 2021/10/05 02:41:32 1.263 +++ loncom/homework/caparesponse/caparesponse.pm 2024/09/29 01:58:43 1.264 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # caparesponse definition # -# $Id: caparesponse.pm,v 1.263 2021/10/05 02:41:32 raeburn Exp $ +# $Id: caparesponse.pm,v 1.264 2024/09/29 01:58:43 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})) { @@ -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') { @@ -648,6 +678,7 @@ sub end_numericalresponse { $result.=''.&Apache::edit::end_table; } elsif ($target eq 'answer' || $target eq 'analyze') { my $part_id="$partid.$id"; + my $samples; if ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); $Apache::lonhomework::analyze{"$part_id.type"} = $tag; @@ -660,7 +691,15 @@ sub end_numericalresponse { if (scalar(@$tagstack)) { &Apache::response::setup_params($tag,$safeeval); } - &add_in_tag_answer($parstack,$safeeval); + if ($tag eq 'numericalresponse') { + $stringify = 1; + } elsif ($tag eq 'formularesponse') { + $samples=&Apache::lonxml::get_param('samples',$parstack,$safeeval); + if ($samples) { + $stringify = 1; + } + } + &add_in_tag_answer($parstack,$safeeval,$stringify); my (@formats)=&Apache::lonxml::get_param_var('format',$parstack,$safeeval); my $unit=&Apache::lonxml::get_param_var('unit',$parstack,$safeeval); @@ -838,7 +877,6 @@ sub end_numericalresponse { } } if ($tag eq 'formularesponse' && $target eq 'answer') { - my $samples=&Apache::lonxml::get_param('samples',$parstack,$safeeval); $result.=&Apache::response::answer_part($tag,$samples); } $result.=&Apache::response::next_answer($tag,$name); @@ -881,8 +919,8 @@ sub format_prior_response_numerical { } sub check_for_answer_errors { - my ($parstack,$safeeval) = @_; - &add_in_tag_answer($parstack,$safeeval); + my ($parstack,$safeeval,$stringify) = @_; + &add_in_tag_answer($parstack,$safeeval,$stringify); my %counts; foreach my $name (keys(%answer)) { push(@{$counts{scalar(@{$answer{$name}{'answers'}})}},$name); @@ -1266,6 +1304,8 @@ sub end_stringresponse { if (!$Apache::lonxml::default_homework_loaded) { &Apache::lonxml::default_homework_load($safeeval); } + my $tag; + if (scalar(@$tagstack)) { $tag=$$tagstack[-1]; } if ( $target eq 'grade' && &Apache::response::submitted() ) { &Apache::response::setup_params('stringresponse',$safeeval); $safeeval->share_from('capa',['&caparesponse_capa_check_answer']); @@ -1308,7 +1348,8 @@ sub end_stringresponse { if ($$args_ref{'type'} eq '') { $$args_ref{'type'} = 'ci'; } - &add_in_tag_answer($parstack,$safeeval); + my $stringify = 1; + &add_in_tag_answer($parstack,$safeeval,$stringify); my (@final_awards,@final_msgs,@names,%ansstring); foreach my $name (keys(%answer)) { &Apache::lonxml::debug(" doing $name with ".join(':',@{ $answer{$name}{'answers'} })); @@ -1399,7 +1440,11 @@ sub end_stringresponse { } } } elsif ($target eq 'answer' || $target eq 'analyze') { - &add_in_tag_answer($parstack,$safeeval); + my $stringify; + if ($type ne 're') { + $stringify = 1; + } + &add_in_tag_answer($parstack,$safeeval,$stringify); if ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"parts"} },"$part.$id"); $Apache::lonhomework::analyze{"$part.$id.type"} = 'stringresponse';