--- loncom/homework/caparesponse/caparesponse.pm 2010/10/14 19:55:04 1.241 +++ loncom/homework/caparesponse/caparesponse.pm 2010/12/16 16:01:08 1.243 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # caparesponse definition # -# $Id: caparesponse.pm,v 1.241 2010/10/14 19:55:04 raeburn Exp $ +# $Id: caparesponse.pm,v 1.243 2010/12/16 16:01:08 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -451,6 +451,7 @@ 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); @@ -1223,17 +1224,36 @@ sub end_stringresponse { $$args_ref{'type'} = 'ci'; } &add_in_tag_answer($parstack,$safeeval); - my (@final_awards,@final_msgs,@names); + my (@final_awards,@final_msgs,@names,%ansstring); foreach my $name (keys(%answer)) { &Apache::lonxml::debug(" doing $name with ".join(':',@{ $answer{$name}{'answers'} })); ${$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=dclone($answer{$name}); my ($result, @msgs)=&Apache::run::run("&caparesponse_check_list()",$safeeval); if ($$args_ref{'type'} =~ /^c[si]$/) { + $ansstring{$name} = pop(@msgs); + } + if ($$args_ref{'type'} =~ /^c[si]$/) { + my $control_chars_removed = pop(@msgs); my $error = pop(@msgs); - if ($error ne '') { - my ($symb,$courseid,$domain,$name) = + if (($error ne '') || + ($control_chars_removed ne '')) { + my ($symb,$courseid,$sdomain,$sname) = &Apache::lonnet::whichuser(); - &Apache::lonnet::logthis("Stringresponse grading error: $error for $name:$domain in $courseid for part: $part response: $id and symb: $symb"); + if ($control_chars_removed ne '') { + my $showresponse = $response; + if ($response =~ /[\000-\037]/) { + $response =~ s/[\000-\037]//g; + } + if ($showresponse =~ /[\r\n\f]/) { + my @lines = split(/[\r\n\f]+/,$showresponse); + $showresponse = join('\\n',@lines); + } + &Apache::lonnet::logthis("Stringresponse grading: control characters stripped from submission ".$showresponse." for $sname:$sdomain in $courseid for part: $part response: $id and symb: $symb"); + $Apache::lonhomework::results{"resource.$part.$id.submission"} = $response; + } + if ($error ne '') { + &Apache::lonnet::logthis("Stringresponse grading error: $error for $sname:$sdomain in $courseid for part: $part response: $id and symb: $symb"); + } } } &Apache::lonxml::debug('msgs are'.join(':',@msgs)); @@ -1250,6 +1270,9 @@ sub end_stringresponse { &Apache::inputtags::finalizeawards(\@final_awards, \@final_msgs, \@names,1); + if (keys(%ansstring) > 0) { + $Apache::lonhomework::results{"resource.$part.$id.answerstring"} = &Apache::lonnet::hash2str(%ansstring); + } } if (($ad eq 'INCORRECT' || $ad eq 'APPROX_ANS' || $ad eq 'EXACT_ANS')) { @@ -1301,6 +1324,9 @@ sub end_stringresponse { if ($target eq 'answer') { $result.=&Apache::response::answer_part('stringresponse', $element); + if ($env{'form.grade_retrieveanswers'}) { + $env{'form.grade_answers.resource.'.$part.'.'.$id} = $element; + } } elsif ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"$part.$id.answer"}{$name}[$i] }, $element);