--- loncom/homework/caparesponse/caparesponse.pm 2010/12/16 16:01:08 1.243 +++ loncom/homework/caparesponse/caparesponse.pm 2011/06/08 20:38:50 1.248 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # caparesponse definition # -# $Id: caparesponse.pm,v 1.243 2010/12/16 16:01:08 raeburn Exp $ +# $Id: caparesponse.pm,v 1.248 2011/06/08 20:38:50 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -280,6 +280,8 @@ sub start_numericalresponse { $token,40). &Apache::loncommon::help_open_topic('Formula_Response_Sampling'); } + $result.=&Apache::edit::text_arg('Pre-Processor Subroutine:','preprocess', + $token,10); $result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); } elsif ($target eq 'modified') { my $constructtag; @@ -287,11 +289,11 @@ sub start_numericalresponse { $constructtag=&Apache::edit::get_new_args($token,$parstack, $safeeval,'answer', 'incorrect','unit', - 'format'); + 'format','preprocess'); } elsif ($token->[1] eq 'formularesponse') { $constructtag=&Apache::edit::get_new_args($token,$parstack, $safeeval,'answer', - 'samples'); + 'samples','preproces'); } if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); @@ -402,7 +404,7 @@ sub setup_capa_response { sub check_submission { my ($response,$partid,$id,$tag,$parstack,$safeeval,$ignore_sig)=@_; - my @args = ('type','tol','sig','format','unit','calc','samples'); + my @args = ('type','tol','sig','format','unit','calc','samples','preprocess'); my $args_ref = &setup_capa_args($safeeval,$parstack,\@args,$response); my $hideunit= @@ -1136,6 +1138,7 @@ sub start_stringresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; my $id = &Apache::response::start_response($parstack,$safeeval); + undef(%answer); if ($target eq 'meta') { $result=&Apache::response::meta_package_write('stringresponse'); } elsif ($target eq 'edit') { @@ -1147,12 +1150,14 @@ sub start_stringresponse { ['re','Regular Expression']],$token); $result.=&Apache::edit::text_arg('String to display for answer:', 'answerdisplay',$token); + $result.=&Apache::edit::text_arg('Pre-Processor Subroutine:','preprocess', + $token,10); $result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); } elsif ($target eq 'modified') { my $constructtag; $constructtag=&Apache::edit::get_new_args($token,$parstack, $safeeval,'answer', - 'type','answerdisplay'); + 'type','answerdisplay','preprocess'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); $result.=&Apache::edit::handle_insert(); @@ -1212,12 +1217,17 @@ sub end_stringresponse { # $answer=$token->[2]->{'answer'}; # } ${$safeeval->varglob('LONCAPA::response')}=$response; + my $preprocess=&Apache::lonxml::get_param('preprocess',$parstack,$safeeval); + $preprocess=~s/^\&//; + if (defined($preprocess)) { + &Apache::run::run('$LONCAPA::response=&'.$preprocess.'($LONCAPA::response);',$safeeval); + } $result = &Apache::run::run('if ($LONCAPA::response=~m'.$answer.') { return 1; } else { return 0; }',$safeeval); &Apache::lonxml::debug("current $response"); &Apache::lonxml::debug("current $answer"); $ad = ($result) ? 'APPROX_ANS' : 'INCORRECT'; } else { - my @args = ('type'); + my @args = ('type','preprocess'); my $args_ref = &setup_capa_args($safeeval,$parstack, \@args,$response); if ($$args_ref{'type'} eq '') { @@ -1231,15 +1241,13 @@ sub end_stringresponse { 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 '') || - ($control_chars_removed ne '')) { + ($control_chars_removed)) { my ($symb,$courseid,$sdomain,$sname) = &Apache::lonnet::whichuser(); - if ($control_chars_removed ne '') { + if ($control_chars_removed) { my $showresponse = $response; if ($response =~ /[\000-\037]/) { $response =~ s/[\000-\037]//g; @@ -1286,16 +1294,27 @@ sub end_stringresponse { $ad='ANONYMOUS_CREDIT'; } } - unless ($env{'request.state'} eq 'construct') { - if ($previous{'used'}) { - if ($ad ne $previous{'award'} && $previous{'award'} ne '') { - &stringresponse_gradechange($part,$id,\%previous, - 'cs',$response,$ad,$type); - } - } elsif ($previous{'usedci'}) { - if ($ad ne $previous{'awardci'} && $previous{'awardci'} ne '') { - &stringresponse_gradechange($part,$id,\%previous, - 'ci',$response,$ad,$type); + unless (($env{'request.state'} eq 'construct') || + ($Apache::lonhomework::type eq 'randomizetry')) { + if (($ad eq 'INCORRECT' || $ad eq 'APPROX_ANS' || $ad eq 'EXACT_ANS')) { + if ($previous{'used'}) { + if ($ad ne $previous{'award'}) { + if (($previous{'award'} eq 'INCORRECT' || + $previous{'award'} eq 'APPROX_ANS' || + $previous{'award'} eq 'EXACT_ANS')) { + &stringresponse_gradechange($part,$id,\%previous, + 'cs',$response,$ad,$type); + } + } + } elsif ($previous{'usedci'}) { + if ($ad ne $previous{'awardci'}) { + if (($previous{'awardci'} eq 'INCORRECT' || + $previous{'awardci'} eq 'APPROX_ANS' || + $previous{'awardci'} eq 'EXACT_ANS')) { + &stringresponse_gradechange($part,$id,\%previous, + 'ci',$response,$ad,$type); + } + } } } }