--- loncom/homework/caparesponse/caparesponse.pm 2003/10/24 17:41:45 1.120 +++ loncom/homework/caparesponse/caparesponse.pm 2004/02/23 20:57:50 1.134 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # caparesponse definition # -# $Id: caparesponse.pm,v 1.120 2003/10/24 17:41:45 sakharuk Exp $ +# $Id: caparesponse.pm,v 1.134 2004/02/23 20:57:50 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,6 +29,7 @@ package Apache::caparesponse; use strict; use capa; +use Apache::lonlocal; BEGIN { &Apache::lonxml::register('Apache::caparesponse',('caparesponse','numericalresponse','stringresponse','formularesponse')); @@ -41,17 +42,13 @@ sub start_numericalresponse { if ($target eq 'edit') { $result.=&Apache::edit::tag_start($target,$token); $result.=&Apache::edit::text_arg('Answer:','answer',$token); - $result.=&Apache::edit::text_arg('Incorrect Answers:','incorrect', - $token); if ($token->[1] eq 'numericalresponse') { + $result.=&Apache::edit::text_arg('Incorrect Answers:','incorrect', + $token); $result.=&Apache::edit::text_arg('Unit:','unit',$token,5). &Apache::loncommon::help_open_topic('Physical_Units'); $result.=&Apache::edit::text_arg('Format:','format',$token,4). &Apache::loncommon::help_open_topic('Numerical_Response_Format'); - } elsif ($token->[1] eq 'stringresponse') { - $result.=&Apache::edit::select_arg('Type:','type', - [['cs','Case Sensitive'],['ci','Case Insensitive'], - ['mc','Case Insensitive, Any Order']],$token); } elsif ($token->[1] eq 'formularesponse') { $result.=&Apache::edit::text_arg('Sample Points:','samples', $token,40). @@ -65,10 +62,6 @@ sub start_numericalresponse { $safeeval,'answer', 'incorrect','unit', 'format'); - } elsif ($token->[1] eq 'stringresponse') { - $constructtag=&Apache::edit::get_new_args($token,$parstack, - $safeeval,'answer', - 'type'); } elsif ($token->[1] eq 'formularesponse') { $constructtag=&Apache::edit::get_new_args($token,$parstack, $safeeval,'answer', @@ -103,14 +96,15 @@ sub end_numericalresponse { if (!$Apache::lonxml::default_homework_loaded) { &Apache::lonxml::default_homework_load($safeeval); } + my $tag; + if (scalar(@$tagstack)) { $tag=$$tagstack[-1]; } if ( $target eq 'grade' && defined($ENV{'form.submitted'})) { - &Apache::response::setup_params($$tagstack[-1]); + &Apache::response::setup_params($tag); $safeeval->share_from('capa',['&caparesponse_capa_check_answer']); my $partid = $Apache::inputtags::part; my $id = $Apache::inputtags::response['-1']; if ($Apache::lonhomework::type eq 'exam' && - ($$tagstack[-1] eq 'formularesponse' || - $$tagstack[-1] eq 'stringresponse')) { + $tag eq 'formularesponse') { $increment=&Apache::response::scored_response($partid,$id); } else { my $response = &Apache::response::getresponse(); @@ -137,18 +131,27 @@ sub end_numericalresponse { my $expression="&caparesponse_check_list('".$response."','". $$parstack[-1]; my $hideunit=&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffunit'); + + foreach my $key (keys(%Apache::inputtags::params)) { + $expression.= ';my $'. #' + $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 $unit=undef;'; } - foreach my $key (keys(%Apache::inputtags::params)) { - $expression.= ';my $'. #' - $key.'="'.$Apache::inputtags::params{$key}.'"'; + #sig fig don't make much sense either + if (($Apache::lonhomework::type eq 'exam' || + $ENV{'form.submitted'} eq 'scantron') && + $tag eq 'numericalresponse') { + $expression.=';my $sig=undef;'; } - if ($$tagstack[-1] eq 'formularesponse') { + + if ($tag eq 'formularesponse') { $expression.=';my $type="fml";'; - } elsif ($$tagstack[-1] eq 'numericalresponse') { + } elsif ($tag eq 'numericalresponse') { $expression.=';my $type="float";'; } $expression.="');"; @@ -177,7 +180,7 @@ sub end_numericalresponse { my $unit=&Apache::lonxml::get_param_var('unit',$parstack, $safeeval); if ($target eq 'web') { - $result="
The correct answer is "; + $result="
".&mt('The correct answer is')." "; } for (my $i=0; $i <= $#answers; $i++) { my $answer=$answers[$i]; @@ -211,7 +214,11 @@ sub end_numericalresponse { my $partid=$Apache::inputtags::part; my $id=$Apache::inputtags::response[-1]; my $number_of_bubbles = &Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.numbubbles'); + if ($Apache::inputtags::params{'numbubbles'}) { + $number_of_bubbles = $Apache::inputtags::params{'numbubbles'}; + } if (!$number_of_bubbles) { $number_of_bubbles=8; } + my (@formats)=&Apache::lonxml::get_param_var('format',$parstack, $safeeval); my $unit=&Apache::lonxml::get_param_var('unit',$parstack, @@ -222,7 +229,7 @@ sub end_numericalresponse { $formats[0],\@incorrect); my @alphabet=('A'..'Z'); if ($target eq 'web') { - if ($$tagstack[-1] eq 'numericalresponse') { + if ($tag eq 'numericalresponse') { if ($unit=~/\S/) {$result.=' (in '.$unit.')

';} $result.= ''; my $previous=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.$id.submission"}; @@ -237,7 +244,7 @@ sub end_numericalresponse { $bubble_values[$ind].''; } $result.='
'; - } elsif ($$tagstack[-1] eq 'formularesponse') { + } elsif ($tag eq 'formularesponse') { $result.= '



'; @@ -246,20 +253,20 @@ sub end_numericalresponse { if ((defined $unit) and ($unit=~/\S/) and ($Apache::lonhomework::type eq 'exam')) { $result.=' \textit{(in} \verb|'.$unit.'|\textit{)} '; } - if ($$tagstack[-1] eq 'numericalresponse') { + if ($tag eq 'numericalresponse') { my ($celllength,$number_of_tables,@table_range)= - &get_table_sizes($formats[0],$number_of_bubbles); + &get_table_sizes($number_of_bubbles,\@bubble_values); my $j=0; 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}{'; for (my $ind=0;$ind<$table_range[$j];$ind++) { - $result.='lp{'.$celllength.' mm}'; + $result.='p{3 mm}p{'.$celllength.' mm}'; } $result.='}'; for (my $ind=$cou;$ind<$cou+$table_range[$j];$ind++) { - $result.='\hskip -3 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -2 mm & {\small '.$bubble_values[$ind].'} '; + $result.='\hskip -4 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$ & \hskip -3 mm {\small '.$bubble_values[$ind].'} '; if ($ind != $cou+$table_range[$j]-1) {$result.=' & ';} } $cou += $table_range[$j]; @@ -286,18 +293,20 @@ sub end_numericalresponse { my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]"; if ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); - $Apache::lonhomework::analyze{"$part_id.type"} = $$tagstack[-1]; + $Apache::lonhomework::analyze{"$part_id.type"} = $tag; my (@incorrect)=&Apache::lonxml::get_param_var('incorrect',$parstack,$safeeval); push (@{ $Apache::lonhomework::analyze{"$part_id.incorrect"} }, @incorrect); } - &Apache::response::setup_params($$tagstack[-1]); + if (scalar(@$tagstack)) { + &Apache::response::setup_params($tag); + } 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); my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval); if ($target eq 'answer') { - $result.=&Apache::response::answer_header($$tagstack[-1]); + $result.=&Apache::response::answer_header($tag); } for(my $i=0;$i<=$#answers;$i++) { my $ans=$answers[$i]; @@ -311,7 +320,7 @@ sub end_numericalresponse { if ($Apache::inputtags::params{'sig'}) { ($sighigh,$siglow)=&get_sigrange($Apache::inputtags::params{'sig'}); } - if ($fmt && $$tagstack[-1] eq 'numericalresponse') { + if ($fmt && $tag eq 'numericalresponse') { $fmt=~s/e/E/g; $ans = sprintf('%.'.$fmt,$ans); if ($high) { @@ -320,15 +329,15 @@ sub end_numericalresponse { } } if ($target eq 'answer') { - if ($high && $$tagstack[-1] eq 'numericalresponse') { $ans.=' ['.$low.','.$high.']'; } - if ($sighigh && $$tagstack[-1] eq 'numericalresponse') { + if ($high && $tag eq 'numericalresponse') { $ans.=' ['.$low.','.$high.']'; } + if ($sighigh && $tag eq 'numericalresponse') { if ($ENV{'form.answer_output_mode'} eq 'tex') { $ans.= " Sig $siglow - $sighigh"; } else { $ans.= " Sig $siglow - $sighigh"; } } - $result.=&Apache::response::answer_part($$tagstack[-1],$ans); + $result.=&Apache::response::answer_part($tag,$ans); } elsif ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"$part_id.answer"} }, $ans); if ($high) { @@ -338,52 +347,28 @@ sub end_numericalresponse { } } if (defined($unit) and ($unit ne '') and - $$tagstack[-1] eq 'numericalresponse') { + $tag eq 'numericalresponse') { if ($target eq 'answer') { if ($ENV{'form.answer_output_mode'} eq 'tex') { - $result.=&Apache::response::answer_part($$tagstack[-1], + $result.=&Apache::response::answer_part($tag, " Unit: $unit "); } else { - $result.=&Apache::response::answer_part($$tagstack[-1], + $result.=&Apache::response::answer_part($tag, "Unit: $unit"); } } elsif ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"$part_id.unit"} }, $unit); } } - if ($type || $$tagstack[-1] eq 'stringresponse') { - my $string='Case Insensitive'; - if ($type eq 'mc') { - $string='Multiple Choice'; - } elsif ($type eq 'cs') { - $string='Case Sensitive'; - } elsif ($type eq 'ci') { - $string='Case Insensitive'; - } elsif ($type eq 'fml') { - $string='Formula'; - } - if ($target eq 'answer') { - if ($ENV{'form.answer_output_mode'} eq 'tex') { - $result.=&Apache::response::answer_part($$tagstack[-1], - "$string"); - } else { - $result.=&Apache::response::answer_part($$tagstack[-1], - "$string"); - } - } elsif ($target eq 'analyze') { - push (@{ $Apache::lonhomework::analyze{"$part_id.str_type"} }, - $type); - } - } - if ($$tagstack[-1] eq 'formularesponse' && $target eq 'answer') { + if ($tag eq 'formularesponse' && $target eq 'answer') { my $samples=&Apache::lonxml::get_param('samples',$parstack,$safeeval); - $result.=&Apache::response::answer_part($$tagstack[-1],$samples); + $result.=&Apache::response::answer_part($tag,$samples); } if ($target eq 'answer') { - $result.=&Apache::response::answer_footer($$tagstack[-1]); + $result.=&Apache::response::answer_footer($tag); } } - if ($target eq 'grade' || $target eq 'web' || + if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') { &Apache::lonxml::increment_counter($increment); } @@ -392,23 +377,40 @@ sub end_numericalresponse { } sub get_table_sizes { - my ($format,$number_of_bubbles)=@_; - my $max_val = 0; - if ($format=~m/^(\d+)E([^\d]*)(\d*)$/) { - $max_val=$1+$2+4; + my ($number_of_bubbles,$rbubble_values)=@_; + my $scale=2; #mm for one digit + my $cell_width=0; + foreach my $member (@$rbubble_values) { + my $cell_width_real=0; + if ($member=~/(\d*)\.?(\d*)(E|e)(\+|-)?(\d*)/) { + $cell_width_real=(length($1)+length($2)+length($5)+9)*$scale; + } elsif ($member=~/(\d*)\.?(\d*)/) { + $cell_width_real=(length($1)+length($2)+3)*$scale; + } else { + $cell_width_real=(length($member)+1)*$scale; + } + if ($cell_width_real>$cell_width) {$cell_width=$cell_width_real;} + } + $cell_width+=8; + my $textwidth; + if ($ENV{'form.textwidth'} ne '') { + $ENV{'form.textwidth'}=~/(\d*)\.?(\d*)/; + $textwidth=$1.'.'.$2; } else { - $max_val=4; + $ENV{'textwidth'}=~/(\d+)\.?(\d*)/; + $textwidth=$1.'.'.$2; } - $max_val = int(0.9*$ENV{'form.textwidth'}/(($max_val+6)*2)); - my $celllength = 0.9*$ENV{'form.textwidth'}/$max_val-10; + my $bubbles_per_line=int($textwidth/$cell_width); + if (($bubbles_per_line > $number_of_bubbles/2) && ($number_of_bubbles % 2==2)) {$bubbles_per_line=$number_of_bubbles/2;} + my $number_of_tables = int($number_of_bubbles/$bubbles_per_line); my @table_range = (); - my $number_of_tables = int($number_of_bubbles/$max_val); - for (my $i=0;$i<$number_of_tables;$i++) {push @table_range,$max_val;} - if ($number_of_bubbles % $max_val != 0) { + for (my $i=0;$i<$number_of_tables;$i++) {push @table_range,$bubbles_per_line;} + if ($number_of_bubbles % $bubbles_per_line) { $number_of_tables++; - push @table_range,($number_of_bubbles % $max_val); + push @table_range,($number_of_bubbles % $bubbles_per_line); } - return ($celllength,$number_of_tables,@table_range); + $cell_width-=8; + return ($cell_width,$number_of_tables,@table_range); } sub format_number { @@ -434,8 +436,8 @@ sub format_number { my $number = $1; my $power = $2; $power=~s/^\+//; - $power=~s/^(-?)0+(\d+)//; - $ans=$number.'$\times 10^{'.$1.$2.'}$'; #'stupidemacs + $power=~s/^(-?)0+(\d+)/$1$2/; + $ans=$number.'$\times 10^{'.$power.'}$'; #'stupidemacs } } return $ans; @@ -448,7 +450,8 @@ sub make_numerical_bubbles { my @oldseed=&Math::Random::random_get_seed(); if (defined($incorrect) && ref($incorrect)) { &Apache::lonxml::debug("inside ".(scalar(@$incorrect)+1 gt $number_of_bubbles)); - if (scalar(@$incorrect)+1 >= $number_of_bubbles) { + if (defined($$incorrect[0]) && + scalar(@$incorrect)+1 >= $number_of_bubbles) { &Apache::lonxml::debug("inside ".(scalar(@$incorrect)+1).":$number_of_bubbles"); &Apache::response::setrandomnumber(); my @rand_inc=&Math::Random::random_permutation(@$incorrect); @@ -456,12 +459,20 @@ sub make_numerical_bubbles { @bubble_values=sort {$a <=> $b} (@bubble_values,$answer); &Apache::lonxml::debug("Answer was :$answer: returning :".$#bubble_values.": whih are :".join(':',@bubble_values)); &Math::Random::random_set_seed(@oldseed); + if (defined($format) && $format ne '') { + foreach my $value (@bubble_values) { + $value=&format_number($value,$format,$target); + } + } return @bubble_values; } - #FIXME what to do when not enough incorrects specified? + if (defined($$incorrect[0]) && + scalar(@$incorrect)+1 < $number_of_bubbles) { + &Apache::lonxml::warning("Not enough incorrect answers were specified in the incorrect array, ignoring the specified incorrect answers and instead generating them."); + } } my @factors = (1.13,1.17,1.25,1.33,1.45); #default values of factors - my @powers = (1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0); #default values for powers + my @powers = (1..$number_of_bubbles); &Apache::response::setrandomnumber(); my $ind=&Math::Random::random_uniform_integer(1,0,$#powers); my $power = $powers[$ind]; @@ -508,24 +519,189 @@ sub get_sigrange { } if (!$sig_ubound) { $sig_ubound=$sig_lbound; } } + if (($sig_ubound<$sig_lbound) || + ($sig_lbound > 15) || + ($sig =~/(\+|-)/ ) ) { + my $errormsg=&mt("Invalid Significant figures detected")." ($sig)"; + if ($ENV{'request.state'} eq 'construct') { + $errormsg.= + &Apache::loncommon::help_open_topic('Significant_Figures'); + } + &Apache::lonxml::error($errormsg); + } return ($sig_ubound,$sig_lbound); } sub start_stringresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; + my $id = &Apache::response::start_response($parstack,$safeeval); if ($target eq 'meta') { &Apache::response::start_response($parstack,$safeeval); $result=&Apache::response::meta_package_write('stringresponse'); &Apache::response::end_response(); - } else { - $result.=&start_numericalresponse(@_); + } elsif ($target eq 'edit') { + $result.=&Apache::edit::tag_start($target,$token); + $result.=&Apache::edit::text_arg('Answer:','answer',$token); + $result.=&Apache::edit::select_arg('Type:','type', + [['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(); + } + } elsif ($target eq 'answer' || $target eq 'grade') { + &Apache::response::reset_params(); } return $result; } sub end_stringresponse { - return end_numericalresponse(@_); + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $increment=1; + my $result = ''; + my $part=$Apache::inputtags::part; + my $id=$Apache::inputtags::response[-1]; + my $answer=&Apache::lonxml::get_param('answer',$parstack,$safeeval); + my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval); + my $answerdisplay=&Apache::lonxml::get_param('answerdisplay',$parstack,$safeeval); + &Apache::lonxml::debug("current $answer ".$token->[2]); + if (!$Apache::lonxml::default_homework_loaded) { + &Apache::lonxml::default_homework_load($safeeval); + } + if ( $target eq 'grade' && defined($ENV{'form.submitted'})) { + &Apache::response::setup_params('stringresponse'); + $safeeval->share_from('capa',['&caparesponse_capa_check_answer']); + if ($Apache::lonhomework::type eq 'exam' || + $ENV{'form.submitted'} eq 'scantron') { + $increment=&Apache::response::scored_response($part,$id); + } else { + my $response = &Apache::response::getresponse(); + if ( $response =~ /[^\s]/) { + my %previous = &Apache::response::check_for_previous($response, + $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; + if ($type eq 're' ) { + # if the RE wasn't in a var it likely got munged, + # thus grab it from the var directly +# my $testans=$token->[2]->{'answer'}; +# 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); + &Apache::lonxml::debug("current $response"); + &Apache::lonxml::debug("current $answer"); + $ad = ($result) ? 'APPROX_ANS' : 'INCORRECT'; + } else { + $response =~ s/\\/\\\\/g; + $response =~ s/\'/\\\'/g; + &Apache::lonxml::debug("current $response"); + my $expression="&caparesponse_check_list('".$response."','". + $$parstack[-1]; + foreach my $key (keys(%Apache::inputtags::params)) { + $expression.= ';my $'. #' + $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"); + &Apache::lonxml::debug("\n
result:$result:$Apache::lonxml::curdepth
\n"); + } + &Apache::response::handle_previous(\%previous,$ad); + $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad; + } + } + } 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(); + $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"); + $Apache::lonhomework::analyze{"$part.$id.type"} = 'stringresponse'; + } + &Apache::response::setup_params('stringresponse'); + if ($target eq 'answer') { + $result.=&Apache::response::answer_header('stringresponse'); + } +# foreach my $ans (@answers) { + if ($target eq 'answer') { + $result.=&Apache::response::answer_part('stringresponse',$answer); + } elsif ($target eq 'analyze') { + push (@{ $Apache::lonhomework::analyze{"$part.$id.answer"} }, + $answer); + } +# } + my $string='Case Insensitive'; + if ($type eq 'mc') { + $string='Multiple Choice'; + } elsif ($type eq 'cs') { + $string='Case Sensitive'; + } elsif ($type eq 'ci') { + $string='Case Insensitive'; + } elsif ($type eq 're') { + $string='Regular Expression'; + } + if ($target eq 'answer') { + if ($ENV{'form.answer_output_mode'} eq 'tex') { + $result.=&Apache::response::answer_part('stringresponse', + "$string"); + } else { + $result.=&Apache::response::answer_part('stringresponse', + "$string"); + } + } elsif ($target eq 'analyze') { + push (@{$Apache::lonhomework::analyze{"$part.$id.str_type"}}, + $type); + } + if ($target eq 'answer') { + $result.=&Apache::response::answer_footer('stringresponse'); + } + } elsif ($target eq 'edit') { + $result.=''.&Apache::edit::end_table; + } + if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || + $target eq 'tex' || $target eq 'analyze') { + &Apache::lonxml::increment_counter($increment); + } + &Apache::response::end_response; + return $result; } sub start_formularesponse {