--- loncom/homework/caparesponse/caparesponse.pm 2004/03/12 21:06:19 1.141
+++ loncom/homework/caparesponse/caparesponse.pm 2004/06/04 22:06:07 1.146
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# caparesponse definition
#
-# $Id: caparesponse.pm,v 1.141 2004/03/12 21:06:19 albertel Exp $
+# $Id: caparesponse.pm,v 1.146 2004/06/04 22:06:07 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -39,6 +39,7 @@ sub start_numericalresponse {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $id = &Apache::response::start_response($parstack,$safeeval);
my $result;
+ undef %{$safeeval->varglob('LONCAPA::CAPAresponse_args')};
if ($target eq 'edit') {
$result.=&Apache::edit::tag_start($target,$token);
$result.=&Apache::edit::text_arg('Answer:','answer',$token);
@@ -85,6 +86,39 @@ sub start_numericalresponse {
$safeeval);
if ($unit =~ /\S/) { $result.=" (in $unit) "; }
}
+ if ( &Apache::response::show_answer() ) {
+ my $answertxt;
+ my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,
+ $safeeval);
+ my (@formats)=&Apache::lonxml::get_param_var('format',$parstack,
+ $safeeval);
+ my $unit=&Apache::lonxml::get_param_var('unit',$parstack,
+ $safeeval);
+ for (my $i=0; $i <= $#answers; $i++) {
+ my $answer=$answers[$i];
+ my $format;
+ if ($#formats > 0) {
+ $format=$formats[$i];
+ } else {
+ $format=$formats[0];
+ }
+ my $formatted;
+ if ((defined($format)) && ($format ne '')) {
+ $format=~s/e/E/g;
+ &Apache::lonxml::debug("formatting with :$format: answer :$answer:");
+ $formatted=sprintf('%.'.$format,$answer).',';
+ } else {
+ &Apache::lonxml::debug("no format answer :$answer:");
+ $formatted="$answer,";
+ }
+ $answertxt.=$formatted;
+ }
+ chop $answertxt;
+ if ($target eq 'web') {
+ $answertxt.=" $unit.
";
+ }
+ $Apache::inputtags::answertxt{$id}=$answertxt;
+ }
}
return $result;
}
@@ -122,51 +156,60 @@ sub end_numericalresponse {
my (@incorrect)=&Apache::lonxml::get_param_var('incorrect',$parstack,$safeeval);
my @values=&make_numerical_bubbles($number_of_bubbles,$target,$answers[0],$formats[0],\@incorrect);
$response=$values[$response];
- } else {
- $response =~ s/\\/\\\\/g;
- $response =~ s/\'/\\\'/g;
}
$Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;
- &Apache::lonxml::debug("current $response");
- my $expression="&caparesponse_check_list('".$response."','".
- $$parstack[-1];
+ my $args_ref= \%{$safeeval->varglob('LONCAPA::CAPAresponse_args')};
+ $$args_ref{'response'}=$response;
my $hideunit=&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffunit');
+ foreach my $arg ('type','tol','sig','ans_fmt','unit','calc',
+ 'samples') {
+ $$args_ref{$arg}=
+ &Apache::lonxml::get_param($arg,$parstack,$safeeval);
+ }
foreach my $key (keys(%Apache::inputtags::params)) {
- $expression.= ';my $__LC__'. #'
- $key.'="'.$Apache::inputtags::params{$key}.'"';
+ $$args_ref{$key}=$Apache::inputtags::params{$key};
}
#no way to enter units, with radio buttons
if ($Apache::lonhomework::type eq 'exam' ||
lc($hideunit) eq "yes") {
- $expression.=';my $__LC__unit=undef;';
+ delete($$args_ref{'unit'});
}
#sig fig don't make much sense either
if (($Apache::lonhomework::type eq 'exam' ||
$ENV{'form.submitted'} eq 'scantron') &&
$tag eq 'numericalresponse') {
- $expression.=';my $__LC__sig=undef;';
+ delete($$args_ref{'sig'});
}
if ($tag eq 'formularesponse') {
- $expression.=';my $__LC__type="fml";';
+ $$args_ref{'type'}='fml';
} elsif ($tag eq 'numericalresponse') {
- $expression.=';my $__LC__type="float";';
+ $$args_ref{'type'}='float';
}
- $expression.="');";
my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
&Apache::lonxml::debug('answer is'.join(':',@answer));
- @{$safeeval->varglob('CAPARESPONSE_CHECK_LIST_answer')}=@answer;
+ @{$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=@answer;
- ($result,my @msgs) = &Apache::run::run($expression,$safeeval);
+ ($result,my @msgs) =
+ &Apache::run::run("&caparesponse_check_list()",$safeeval);
&Apache::lonxml::debug('msgs are'.join(':',@msgs));
- my ($awards) = split /:/ , $result;
- ($ad) = &Apache::inputtags::finalizeawards(split /,/ , $awards);
- &Apache::lonxml::debug("$expression");
+ my ($awards)=split(/:/,$result);
+ my (@awards) = split(/,/,$awards);
+ ($ad,my $msg) = &Apache::inputtags::finalizeawards(\@awards,\@msgs);
+ &Apache::lonxml::debug('ad is'.$ad);
+ if ($ad eq 'SIG_FAIL') {
+ my ($sig_u,$sig_l)=
+ &get_sigrange($Apache::inputtags::params{'sig'});
+ $msg=join(':',$msg,$sig_l,$sig_u);
+ &Apache::lonxml::debug("sigs bad $sig_u $sig_l ".
+ $Apache::inputtags::params{'sig'});
+ }
&Apache::lonxml::debug("\n
result:$result:$Apache::lonxml::curdepth
\n");
&Apache::response::handle_previous(\%previous,$ad);
$Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad;
+ $Apache::lonhomework::results{"resource.$partid.$id.awardmsg"}=$msg;
$result='';
}
}
@@ -175,42 +218,6 @@ sub end_numericalresponse {
$safeeval);
my $award = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
my $status = $Apache::inputtags::status['-1'];
- if ( &Apache::response::show_answer() ) {
- my (@formats)=&Apache::lonxml::get_param_var('format',$parstack,
- $safeeval);
- my $unit=&Apache::lonxml::get_param_var('unit',$parstack,
- $safeeval);
- if ($target eq 'web') {
- $result="
".&mt('The correct answer is')." ";
- }
- for (my $i=0; $i <= $#answers; $i++) {
- my $answer=$answers[$i];
- my $format;
- if ($#formats > 0) {
- $format=$formats[$i];
- } else {
- $format=$formats[0];
- }
- my $formatted;
- if ((defined($format)) && ($format ne '')) {
- $format=~s/e/E/g;
- &Apache::lonxml::debug("formatting with :$format: answer :$answer:");
- $formatted=sprintf('%.'.$format,$answer).',';
- } else {
- &Apache::lonxml::debug("no format answer :$answer:");
- $formatted="$answer,";
- }
- if ($target eq 'tex') {
- $formatted='';
- #$formatted=&Apache::lonxml::latex_special_symbols($formatted);
- }
- $result.=$formatted;
- }
- chop $result;
- if ($target eq 'web') {
- $result.=" $unit.
";
- }
- }
if ($Apache::lonhomework::type eq 'exam') {
my $partid=$Apache::inputtags::part;
my $id=$Apache::inputtags::response[-1];
@@ -261,7 +268,7 @@ sub end_numericalresponse {
my $cou=0;
$result.='\vskip -1 mm \noindent \begin{enumerate}\item[\textbf{'.$Apache::lonxml::counter.'}.]';
for (my $i=0;$i<$number_of_tables;$i++) {
- $result.='\vskip -1 mm \noindent \begin{tabular}{';
+ $result.='\vskip -1 mm \noindent \setlength{\tabcolsep}{2 mm}\begin{tabular}{';
for (my $ind=0;$ind<$table_range[$j];$ind++) {
$result.='p{3 mm}p{'.$celllength.' mm}';
}
@@ -331,7 +338,7 @@ sub end_numericalresponse {
}
if ($target eq 'answer') {
if ($high && $tag eq 'numericalresponse') { $ans.=' ['.$low.','.$high.']'; }
- if ($sighigh && $tag eq 'numericalresponse') {
+ if (defined($sighigh) && $tag eq 'numericalresponse') {
if ($ENV{'form.answer_output_mode'} eq 'tex') {
$ans.= " Sig $siglow - $sighigh";
} else {
@@ -517,11 +524,11 @@ sub get_sigrange {
$sig_ubound =15; #SIG_UB_DEFAULT
} else {
($sig_lbound,$sig_ubound) = split(/,/,$sig);
- if (!$sig_lbound) {
+ if (!defined($sig_lbound)) {
$sig_lbound = 0; #SIG_LB_DEFAULT
$sig_ubound =15; #SIG_UB_DEFAULT
}
- if (!$sig_ubound) { $sig_ubound=$sig_lbound; }
+ if (!defined($sig_ubound)) { $sig_ubound=$sig_lbound; }
}
if (($sig_ubound<$sig_lbound) ||
($sig_lbound > 15) ||
@@ -551,18 +558,21 @@ sub start_stringresponse {
[['cs','Case Sensitive'],['ci','Case Insensitive'],
['mc','Case Insensitive, Any Order'],
['re','Regular Expression']],$token);
- $result.=&Apache::edit::checked_arg('Answer Display:','answerdisplay',
- [['inline','Inline']],$token);
$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');
- if ($constructtag) {
- $result = &Apache::edit::rebuild_tag($token);
- $result.=&Apache::edit::handle_insert();
- }
+ my $constructtag;
+ $constructtag=&Apache::edit::get_new_args($token,$parstack,
+ $safeeval,'answer',
+ 'type','answerdisplay');
+ if ($constructtag) {
+ $result = &Apache::edit::rebuild_tag($token);
+ $result.=&Apache::edit::handle_insert();
+ }
+ } elsif ($target eq 'web') {
+ if ( &Apache::response::show_answer() ) {
+ $Apache::inputtags::answertxt{$id}=
+ &Apache::lonxml::get_param('answer',$parstack,$safeeval);
+ }
} elsif ($target eq 'answer' || $target eq 'grade') {
&Apache::response::reset_params();
}
@@ -595,10 +605,9 @@ sub end_stringresponse {
$part,$id);
&Apache::lonxml::debug("submitted a $response
\n");
&Apache::lonxml::debug($$parstack[-1] . "\n
");
-
$Apache::lonhomework::results{"resource.$part.$id.submission"}=
$response;
- my $ad;
+ my ($ad,$msg);
if ($type eq 're' ) {
# if the RE wasn't in a var it likely got munged,
# thus grab it from the var directly
@@ -606,45 +615,39 @@ sub end_stringresponse {
# if ($testans !~ m/^\s*\$/) {
# $answer=$token->[2]->{'answer'};
# }
- ${$safeeval->varglob('LONCAPA_INTERNAL_response')}=
- $response;
- $result = &Apache::run::run('return $LONCAPA_INTERNAL_response=~m'.$answer,$safeeval);
+ ${$safeeval->varglob('LONCAPA::response')}=$response;
+ $result = &Apache::run::run('return $LONCAPA::response=~m'.$answer,$safeeval);
&Apache::lonxml::debug("current $response");
&Apache::lonxml::debug("current $answer");
$ad = ($result) ? 'APPROX_ANS' : 'INCORRECT';
} else {
- $response =~ s/\\/\\\\/g;
- $response =~ s/\'/\\\'/g;
+ my $args_ref=
+ \%{$safeeval->varglob('LONCAPA::CAPAresponse_args')};
+
+ $$args_ref{'response'}=$response;
&Apache::lonxml::debug("current $response");
- my $expression="&caparesponse_check_list('".$response."','".
- $$parstack[-1];
+ $$args_ref{'type'}=
+ &Apache::lonxml::get_param('type',$parstack,$safeeval);
foreach my $key (keys(%Apache::inputtags::params)) {
- $expression.= ';my $'. #'
- $key.'="'.$Apache::inputtags::params{$key}.'"';
+ $$args_ref{$key}=$Apache::inputtags::params{$key};
}
- $expression.="');";
&Apache::lonxml::debug('answer is'.join(':',$answer));
- @{$safeeval->varglob('CAPARESPONSE_CHECK_LIST_answer')}=($answer);
- $result = &Apache::run::run($expression,$safeeval);
- my ($awards) = split /:/ , $result;
- ($ad) = &Apache::inputtags::finalizeawards(split /,/ , $awards);
- &Apache::lonxml::debug("$expression");
+ @{$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=($answer);
+ ($result, my @msgs)=&Apache::run::run("&caparesponse_check_list()",$safeeval);
+ &Apache::lonxml::debug('msgs are'.join(':',@msgs));
+ my ($awards)=split(/:/,$result);
+ my (@awards) = split(/,/,$awards);
+ ($ad,$msg) = &Apache::inputtags::finalizeawards(\@awards,\@msgs);
&Apache::lonxml::debug("\n
result:$result:$Apache::lonxml::curdepth
\n");
}
&Apache::response::handle_previous(\%previous,$ad);
$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
+ $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::response::show_answer() ) {
- if ($target eq 'web') {
- $result=($answerdisplay eq 'inline'?'':"
".&mt('The correct answer is')." ")
- .$answer;
-# join(', ',@answers).".
";
- }
- }
if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') {
$result.='\fbox{\fbox{\parbox{\textwidth-5mm}{\strut\\\\\strut\\\\\strut\\\\\strut\\\\}}}';
$increment = &Apache::response::repetition();