--- loncom/homework/caparesponse/caparesponse.pm 2005/12/06 10:01:57 1.184 +++ loncom/homework/caparesponse/caparesponse.pm 2006/06/13 14:58:14 1.190 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # caparesponse definition # -# $Id: caparesponse.pm,v 1.184 2005/12/06 10:01:57 albertel Exp $ +# $Id: caparesponse.pm,v 1.190 2006/06/13 14:58:14 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,11 +29,13 @@ package Apache::caparesponse; use strict; use capa; +use Safe::Hole; +use Apache::lonmaxima(); use Apache::lonlocal; use Apache::lonnet; BEGIN { - &Apache::lonxml::register('Apache::caparesponse',('caparesponse','numericalresponse','stringresponse','formularesponse')); + &Apache::lonxml::register('Apache::caparesponse',('caparesponse','numericalresponse','stringresponse','formularesponse','mathresponse')); } my %answer; @@ -191,17 +193,22 @@ sub start_numericalresponse { $safeeval); for (my $i=0; $i <= $#answers; $i++) { my $answer=$answers[$i]; - my $format; - if ($#formats > 0) { - $format=$formats[$i]; + if ( scalar(@$tagstack) + && $tagstack->[-1] ne 'numericalresponse') { + $answertxt.=$answer.','; } else { - $format=$formats[0]; + my $format; + if ($#formats > 0) { + $format=$formats[$i]; + } else { + $format=$formats[0]; + } + if ($unit=~/\$/) { $format="\$".$format; $unit=~s/\$//g; } + if ($unit=~/\,/) { $format="\,".$format; $unit=~s/\,//g; } + my $formatted=&format_number($answer,$format,$target, + $safeeval); + $answertxt.=$formatted.','; } - if ($unit=~/\$/) { $format="\$".$format; $unit=~s/\$//g; } - if ($unit=~/\,/) { $format="\,".$format; $unit=~s/\,//g; } - my $formatted=&format_number($answer,$format,$target, - $safeeval); - $answertxt.=$formatted.','; } chop $answertxt; if ($target eq 'web') { @@ -243,6 +250,8 @@ sub check_submission { if ($tag eq 'formularesponse') { $$args_ref{'type'}='fml'; + } elsif ($tag eq 'mathresponse') { + $$args_ref{'type'}='math'; } elsif ($tag eq 'numericalresponse') { $$args_ref{'type'}='float'; } @@ -285,12 +294,15 @@ sub end_numericalresponse { my $partid = $Apache::inputtags::part; my $id = $Apache::inputtags::response[-1]; my $tag; + my $safehole = new Safe::Hole; $safeeval->share_from('capa',['&caparesponse_capa_check_answer']); + $safehole->wrap(\&Apache::lonmaxima::maxima_check,$safeeval,'&maxima_check'); + if (scalar(@$tagstack)) { $tag=$$tagstack[-1]; } if ( $target eq 'grade' && &Apache::response::submitted() ) { &Apache::response::setup_params($tag,$safeeval); if ($Apache::lonhomework::type eq 'exam' && - $tag eq 'formularesponse') { + (($tag eq 'formularesponse') || ($tag eq 'mathresponse'))) { $increment=&Apache::response::scored_response($partid,$id); } else { my $response = &Apache::response::getresponse(); @@ -357,10 +369,6 @@ sub end_numericalresponse { $bubble_display->[$ind].''; } $result.=''; - } elsif ($tag eq 'formularesponse') { - $result.= '

-

'; } } elsif ($target eq 'tex') { if ((defined $unit) and ($unit=~/\S/) and ($Apache::lonhomework::type eq 'exam')) { @@ -388,14 +396,7 @@ sub end_numericalresponse { } $result.='\end{enumerate}'; } else { - $result.='\fbox{\fbox{\parbox{\textwidth-5mm}{\strut\\\\\strut\\\\\strut\\\\\strut\\\\}}}'; - my $repetition = &Apache::response::repetition(); - $result.='\begin{enumerate}'; - for (my $i=0;$i<$repetition;$i++) { - $result.='\item[\textbf{'.($Apache::lonxml::counter+$i).'}.]\textit{Leave blank on scoring form}\vskip 0 mm'; - } - $increment=$repetition; - $result.= '\end{enumerate}'; + $increment = &Apache::response::repetition(); } } } @@ -422,7 +423,8 @@ sub end_numericalresponse { if ($target eq 'answer') { $result.=&Apache::response::answer_header($tag); - if ($Apache::lonhomework::type eq 'exam') { + if ($tag eq 'numericalresponse' + && $Apache::lonhomework::type eq 'exam') { my ($bubble_values,undef,$correct) = &make_numerical_bubbles($partid, $id,$target,$parstack,$safeeval); $result.=&Apache::response::answer_part($tag,$correct); @@ -603,7 +605,7 @@ sub format_number { my $ans; if ($format eq '') { #What is the number? (integer,decimal,floating point) - if ($number=~/^(\d*\.?\d*)(E|e)(\d*)$/) { + if ($number=~/^(\d*\.?\d*)(E|e)[+\-]?(\d*)$/) { $format = '3e'; } elsif ($number=~/^(\d*)\.(\d*)$/) { $format = '4f'; @@ -781,7 +783,7 @@ sub start_stringresponse { sub end_stringresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - my $increment=1; + my $result = ''; my $part=$Apache::inputtags::part; my $id=$Apache::inputtags::response[-1]; @@ -797,7 +799,8 @@ sub end_stringresponse { $safeeval->share_from('capa',['&caparesponse_capa_check_answer']); if ($Apache::lonhomework::type eq 'exam' || &Apache::response::submitted('scantron')) { - $increment=&Apache::response::scored_response($part,$id); + &Apache::response::scored_response($part,$id); + } else { my $response = &Apache::response::getresponse(); if ( $response =~ /[^\s]/) { @@ -850,19 +853,6 @@ sub end_stringresponse { $Apache::lonhomework::results{"resource.$part.$id.awardmsg"}=$msg; } } - } elsif ($target eq 'web' || $target eq 'tex') { - my $award = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"}; - my $status = $Apache::inputtags::status['-1']; - if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') { - $result.='\fbox{\fbox{\parbox{\textwidth-5mm}{\strut\\\\\strut\\\\\strut\\\\\strut\\\\}}}'; - $increment = &Apache::response::repetition(); - $result.='\begin{enumerate}'; - for (my $i=0;$i<$increment;$i++) { - $result.='\item[\textbf{'.($Apache::lonxml::counter+$i). - '}.]\textit{Leave blank on scoring form}\vskip 0 mm'; - } - $result.= '\end{enumerate}'; - } } elsif ($target eq 'answer' || $target eq 'analyze') { if ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"parts"} },"$part.$id"); @@ -916,7 +906,7 @@ sub end_stringresponse { } if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') { - &Apache::lonxml::increment_counter($increment); + &Apache::lonxml::increment_counter(&Apache::response::repetition()); } &Apache::response::end_response; return $result; @@ -939,6 +929,23 @@ sub end_formularesponse { return end_numericalresponse(@_); } +sub start_mathresponse { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result; + if ($target eq 'meta') { + &Apache::response::start_response($parstack,$safeeval); + $result=&Apache::response::meta_package_write('mathresponse'); + &Apache::response::end_response(); + } else { + $result.=&start_numericalresponse(@_); + } + return $result; +} + +sub end_mathresponse { + return end_numericalresponse(@_); +} + 1; __END__