Diff for /loncom/homework/caparesponse/caparesponse.pm between versions 1.129 and 1.144

version 1.129, 2004/02/13 15:09:52 version 1.144, 2004/04/06 15:54:35
Line 39  sub start_numericalresponse { Line 39  sub start_numericalresponse {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $id = &Apache::response::start_response($parstack,$safeeval);      my $id = &Apache::response::start_response($parstack,$safeeval);
     my $result;      my $result;
       undef %{$safeeval->varglob('LONCAPA::CAPAresponse_args')};
     if ($target eq 'edit') {      if ($target eq 'edit') {
  $result.=&Apache::edit::tag_start($target,$token);   $result.=&Apache::edit::tag_start($target,$token);
  $result.=&Apache::edit::text_arg('Answer:','answer',$token);   $result.=&Apache::edit::text_arg('Answer:','answer',$token);
Line 99  sub end_numericalresponse { Line 100  sub end_numericalresponse {
     my $tag;      my $tag;
     if (scalar(@$tagstack)) { $tag=$$tagstack[-1]; }      if (scalar(@$tagstack)) { $tag=$$tagstack[-1]; }
     if ( $target eq 'grade' && defined($ENV{'form.submitted'})) {      if ( $target eq 'grade' && defined($ENV{'form.submitted'})) {
  &Apache::response::setup_params($tag);   &Apache::response::setup_params($tag,$safeeval);
  $safeeval->share_from('capa',['&caparesponse_capa_check_answer']);   $safeeval->share_from('capa',['&caparesponse_capa_check_answer']);
  my $partid = $Apache::inputtags::part;   my $partid = $Apache::inputtags::part;
  my $id = $Apache::inputtags::response['-1'];   my $id = $Apache::inputtags::response['-1'];
Line 122  sub end_numericalresponse { Line 123  sub end_numericalresponse {
     my (@incorrect)=&Apache::lonxml::get_param_var('incorrect',$parstack,$safeeval);      my (@incorrect)=&Apache::lonxml::get_param_var('incorrect',$parstack,$safeeval);
     my @values=&make_numerical_bubbles($number_of_bubbles,$target,$answers[0],$formats[0],\@incorrect);      my @values=&make_numerical_bubbles($number_of_bubbles,$target,$answers[0],$formats[0],\@incorrect);
     $response=$values[$response];      $response=$values[$response];
  } else {  
     $response =~ s/\\/\\\\/g;  
     $response =~ s/\'/\\\'/g;  
  }   }
  $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;   $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;
  &Apache::lonxml::debug("current $response");   my $args_ref= \%{$safeeval->varglob('LONCAPA::CAPAresponse_args')};
  my $expression="&caparesponse_check_list('".$response."','".   $$args_ref{'response'}=$response;
     $$parstack[-1];  
  my $hideunit=&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffunit');   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)) {   foreach my $key (keys(%Apache::inputtags::params)) {
     $expression.= ';my $'. #'      $$args_ref{$key}=$Apache::inputtags::params{$key};
  $key.'="'.$Apache::inputtags::params{$key}.'"';  
  }   }
   
  #no way to enter units, with radio buttons   #no way to enter units, with radio buttons
  if ($Apache::lonhomework::type eq 'exam' ||   if ($Apache::lonhomework::type eq 'exam' ||
     lc($hideunit) eq "yes") {      lc($hideunit) eq "yes") {
     $expression.=';my $unit=undef;';      delete($$args_ref{'unit'});
  }   }
  #sig fig don't make much sense either   #sig fig don't make much sense either
  if (($Apache::lonhomework::type eq 'exam' ||   if (($Apache::lonhomework::type eq 'exam' ||
      $ENV{'form.submitted'} eq 'scantron') &&       $ENV{'form.submitted'} eq 'scantron') &&
     $tag eq 'numericalresponse') {      $tag eq 'numericalresponse') {
     $expression.=';my $sig=undef;';      delete($$args_ref{'sig'});
  }   }
   
  if ($tag eq 'formularesponse') {   if ($tag eq 'formularesponse') {
     $expression.=';my $type="fml";';      $$args_ref{'type'}='fml';
  } elsif ($tag eq 'numericalresponse') {   } elsif ($tag eq 'numericalresponse') {
     $expression.=';my $type="float";';      $$args_ref{'type'}='float';
  }   }
  $expression.="');";  
  my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);   my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
  &Apache::lonxml::debug('answer is'.join(':',@answer));   &Apache::lonxml::debug('answer is'.join(':',@answer));
  @{$safeeval->varglob('CAPARESPONSE_CHECK_LIST_answer')}=@answer;   @{$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=@answer;
   
  $result = &Apache::run::run($expression,$safeeval);   ($result,my @msgs) = 
  my ($awards) = split /:/ , $result;      &Apache::run::run("&caparesponse_check_list()",$safeeval);
  ($ad) = &Apache::inputtags::finalizeawards(split /,/ , $awards);   &Apache::lonxml::debug('msgs are'.join(':',@msgs));
  &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<br>result:$result:$Apache::lonxml::curdepth<br>\n");   &Apache::lonxml::debug("\n<br>result:$result:$Apache::lonxml::curdepth<br>\n");
  &Apache::response::handle_previous(\%previous,$ad);   &Apache::response::handle_previous(\%previous,$ad);
  $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad;   $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad;
    $Apache::lonhomework::results{"resource.$partid.$id.awardmsg"}=$msg;
  $result='';   $result='';
     }      }
  }   }
Line 260  sub end_numericalresponse { Line 271  sub end_numericalresponse {
     my $cou=0;      my $cou=0;
     $result.='\vskip -1 mm \noindent \begin{enumerate}\item[\textbf{'.$Apache::lonxml::counter.'}.]';      $result.='\vskip -1 mm \noindent \begin{enumerate}\item[\textbf{'.$Apache::lonxml::counter.'}.]';
     for (my $i=0;$i<$number_of_tables;$i++) {      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++) {   for (my $ind=0;$ind<$table_range[$j];$ind++) {
     $result.='p{3 mm}p{'.$celllength.' mm}';      $result.='p{3 mm}p{'.$celllength.' mm}';
  }   }
Line 298  sub end_numericalresponse { Line 309  sub end_numericalresponse {
     push (@{ $Apache::lonhomework::analyze{"$part_id.incorrect"} }, @incorrect);      push (@{ $Apache::lonhomework::analyze{"$part_id.incorrect"} }, @incorrect);
  }   }
  if (scalar(@$tagstack)) {   if (scalar(@$tagstack)) {
     &Apache::response::setup_params($tag);      &Apache::response::setup_params($tag,$safeeval);
  }   }
  my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);   my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
  my (@formats)=&Apache::lonxml::get_param_var('format',$parstack,$safeeval);   my (@formats)=&Apache::lonxml::get_param_var('format',$parstack,$safeeval);
Line 382  sub get_table_sizes { Line 393  sub get_table_sizes {
     my $cell_width=0;      my $cell_width=0;
     foreach my $member (@$rbubble_values) {      foreach my $member (@$rbubble_values) {
  my $cell_width_real=0;   my $cell_width_real=0;
  if ($member=~/(\d*)\.?(\d*)(E|e)(\+|-)?(\d*)/) {   if ($member=~/(\+|-)?(\d*)\.?(\d*)\s*\$\\times\s*10\^{(\+|-)?(\d+)}\$/) {
       $cell_width_real=(length($2)+length($3)+length($5)+7)*$scale;
    } elsif ($member=~/(\d*)\.?(\d*)(E|e)(\+|-)?(\d*)/) {
     $cell_width_real=(length($1)+length($2)+length($5)+9)*$scale;      $cell_width_real=(length($1)+length($2)+length($5)+9)*$scale;
  } elsif ($member=~/(\d*)\.?(\d*)/) {          } elsif ($member=~/(\d*)\.(\d*)/) {
     $cell_width_real=(length($1)+length($2)+2)*$scale;      $cell_width_real=(length($1)+length($2)+3)*$scale;
  } else {   } else {
     $cell_width_real=(length($member)+1)*$scale;      $cell_width_real=(length($member)+1)*$scale*0.9;
  }   }
  if ($cell_width_real>$cell_width) {$cell_width=$cell_width_real;}   if ($cell_width_real>$cell_width) {$cell_width=$cell_width_real;}
     }      }
     $cell_width+=8;      $cell_width+=8; 
     $ENV{'form.textwidth'}=~/(\d+)/;      my $textwidth;
     my $textwidth=$1;      if ($ENV{'form.textwidth'} ne '') {
    $ENV{'form.textwidth'}=~/(\d*)\.?(\d*)/;
    $textwidth=$1.'.'.$2;
       } else {
    $ENV{'textwidth'}=~/(\d+)\.?(\d*)/;
    $textwidth=$1.'.'.$2;
       }
     my $bubbles_per_line=int($textwidth/$cell_width);      my $bubbles_per_line=int($textwidth/$cell_width);
       if (($bubbles_per_line > $number_of_bubbles/2) && ($number_of_bubbles % 2==0)) {$bubbles_per_line=$number_of_bubbles/2;}
     my $number_of_tables = int($number_of_bubbles/$bubbles_per_line);      my $number_of_tables = int($number_of_bubbles/$bubbles_per_line);
     my @table_range = ();      my @table_range = ();
     for (my $i=0;$i<$number_of_tables;$i++) {push @table_range,$bubbles_per_line;}      for (my $i=0;$i<$number_of_tables;$i++) {push @table_range,$bubbles_per_line;}
Line 403  sub get_table_sizes { Line 423  sub get_table_sizes {
  push @table_range,($number_of_bubbles % $bubbles_per_line);   push @table_range,($number_of_bubbles % $bubbles_per_line);
     }      }
     $cell_width-=8;      $cell_width-=8;
       $cell_width=$cell_width*3/4;
     return ($cell_width,$number_of_tables,@table_range);      return ($cell_width,$number_of_tables,@table_range);
 }  }
   
Line 452  sub make_numerical_bubbles { Line 473  sub make_numerical_bubbles {
     @bubble_values=sort {$a <=> $b} (@bubble_values,$answer);      @bubble_values=sort {$a <=> $b} (@bubble_values,$answer);
     &Apache::lonxml::debug("Answer was :$answer: returning :".$#bubble_values.": whih are :".join(':',@bubble_values));      &Apache::lonxml::debug("Answer was :$answer: returning :".$#bubble_values.": whih are :".join(':',@bubble_values));
     &Math::Random::random_set_seed(@oldseed);      &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;      return @bubble_values;
  }   }
  if (defined($$incorrect[0]) &&   if (defined($$incorrect[0]) &&
Line 507  sub get_sigrange { Line 533  sub get_sigrange {
  }   }
  if (!$sig_ubound) { $sig_ubound=$sig_lbound; }   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);      return ($sig_ubound,$sig_lbound);
 }  }
   
Line 529  sub start_stringresponse { Line 565  sub start_stringresponse {
     [['inline','Inline']],$token);      [['inline','Inline']],$token);
  $result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row();   $result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  &Apache::edit::get_new_args($token,$parstack,         my $constructtag;
     $safeeval,'answer','type');         $constructtag=&Apache::edit::get_new_args($token,$parstack,
  my $answerdisplay=$ENV{'form.'.&Apache::edit::html_element_name('answerdisplay')};                                                   $safeeval,'answer',
  if ($answerdisplay) {                                                   'type','answerdisplay');
     $token->[2]->{'answerdisplay'}=$answerdisplay;         if ($constructtag) {
  } else {             $result = &Apache::edit::rebuild_tag($token);
     delete $token->[2]->{'answerdisplay'};             $result.=&Apache::edit::handle_insert();
  }         }
  $result = &Apache::edit::rebuild_tag($token);  
  $result.=&Apache::edit::handle_insert();  
     } elsif ($target eq 'answer' || $target eq 'grade') {      } elsif ($target eq 'answer' || $target eq 'grade') {
  &Apache::response::reset_params();   &Apache::response::reset_params();
     }      }
Line 559  sub end_stringresponse { Line 593  sub end_stringresponse {
  &Apache::lonxml::default_homework_load($safeeval);   &Apache::lonxml::default_homework_load($safeeval);
     }      }
     if ( $target eq 'grade' && defined($ENV{'form.submitted'})) {      if ( $target eq 'grade' && defined($ENV{'form.submitted'})) {
  &Apache::response::setup_params('stringresponse');   &Apache::response::setup_params('stringresponse',$safeeval);
  $safeeval->share_from('capa',['&caparesponse_capa_check_answer']);   $safeeval->share_from('capa',['&caparesponse_capa_check_answer']);
  if ($Apache::lonhomework::type eq 'exam' ||   if ($Apache::lonhomework::type eq 'exam' ||
     $ENV{'form.submitted'} eq 'scantron') {      $ENV{'form.submitted'} eq 'scantron') {
Line 571  sub end_stringresponse { Line 605  sub end_stringresponse {
     $part,$id);      $part,$id);
  &Apache::lonxml::debug("submitted a $response<br>\n");   &Apache::lonxml::debug("submitted a $response<br>\n");
  &Apache::lonxml::debug($$parstack[-1] . "\n<br>");   &Apache::lonxml::debug($$parstack[-1] . "\n<br>");
   
  $Apache::lonhomework::results{"resource.$part.$id.submission"}=   $Apache::lonhomework::results{"resource.$part.$id.submission"}=
     $response;      $response;
  my $ad;   my ($ad,$msg);
  if ($type eq 're' ) {    if ($type eq 're' ) { 
     # if the RE wasn't in a var it likely got munged,      # if the RE wasn't in a var it likely got munged,
                     # thus grab it from the var directly                      # thus grab it from the var directly
Line 582  sub end_stringresponse { Line 615  sub end_stringresponse {
 #    if ($testans !~ m/^\s*\$/) {  #    if ($testans !~ m/^\s*\$/) {
 # $answer=$token->[2]->{'answer'};  # $answer=$token->[2]->{'answer'};
 #    }  #    }
     ${$safeeval->varglob('LONCAPA_INTERNAL_response')}=      ${$safeeval->varglob('LONCAPA::response')}=$response;
  $response;      $result = &Apache::run::run('return $LONCAPA::response=~m'.$answer,$safeeval);
     $result = &Apache::run::run('return $LONCAPA_INTERNAL_response=~m'.$answer,$safeeval);  
     &Apache::lonxml::debug("current $response");      &Apache::lonxml::debug("current $response");
     &Apache::lonxml::debug("current $answer");      &Apache::lonxml::debug("current $answer");
     $ad = ($result) ? 'APPROX_ANS' : 'INCORRECT';      $ad = ($result) ? 'APPROX_ANS' : 'INCORRECT';
  } else {   } else {
     $response =~ s/\\/\\\\/g;      my $args_ref= 
     $response =~ s/\'/\\\'/g;   \%{$safeeval->varglob('LONCAPA::CAPAresponse_args')};
   
       $$args_ref{'response'}=$response;
     &Apache::lonxml::debug("current $response");      &Apache::lonxml::debug("current $response");
     my $expression="&caparesponse_check_list('".$response."','".      $$args_ref{'type'}=
  $$parstack[-1];   &Apache::lonxml::get_param('type',$parstack,$safeeval);
     foreach my $key (keys(%Apache::inputtags::params)) {      foreach my $key (keys(%Apache::inputtags::params)) {
  $expression.= ';my $'. #'   $$args_ref{$key}=$Apache::inputtags::params{$key};
     $key.'="'.$Apache::inputtags::params{$key}.'"';  
     }      }
     $expression.="');";  
     &Apache::lonxml::debug('answer is'.join(':',$answer));      &Apache::lonxml::debug('answer is'.join(':',$answer));
     @{$safeeval->varglob('CAPARESPONSE_CHECK_LIST_answer')}=($answer);      @{$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=($answer);
     $result = &Apache::run::run($expression,$safeeval);      ($result, my @msgs)=&Apache::run::run("&caparesponse_check_list()",$safeeval);
     my ($awards) = split /:/ , $result;      &Apache::lonxml::debug('msgs are'.join(':',@msgs));
     ($ad) = &Apache::inputtags::finalizeawards(split /,/ , $awards);      my ($awards)=split(/:/,$result);
     &Apache::lonxml::debug("$expression");      my (@awards) = split(/,/,$awards);
       ($ad,$msg) = &Apache::inputtags::finalizeawards(\@awards,\@msgs);
     &Apache::lonxml::debug("\n<br>result:$result:$Apache::lonxml::curdepth<br>\n");      &Apache::lonxml::debug("\n<br>result:$result:$Apache::lonxml::curdepth<br>\n");
  }   }
  &Apache::response::handle_previous(\%previous,$ad);   &Apache::response::handle_previous(\%previous,$ad);
  $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;   $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
    $Apache::lonhomework::results{"resource.$part.$id.awardmsg"}=$msg;
     }      }
  }   }
     } elsif ($target eq 'web' || $target eq 'tex') {      } elsif ($target eq 'web' || $target eq 'tex') {
Line 636  sub end_stringresponse { Line 670  sub end_stringresponse {
     push (@{ $Apache::lonhomework::analyze{"parts"} },"$part.$id");      push (@{ $Apache::lonhomework::analyze{"parts"} },"$part.$id");
     $Apache::lonhomework::analyze{"$part.$id.type"} = 'stringresponse';      $Apache::lonhomework::analyze{"$part.$id.type"} = 'stringresponse';
  }   }
  &Apache::response::setup_params('stringresponse');   &Apache::response::setup_params('stringresponse',$safeeval);
  if ($target eq 'answer') {   if ($target eq 'answer') {
     $result.=&Apache::response::answer_header('stringresponse');      $result.=&Apache::response::answer_header('stringresponse');
  }   }

Removed from v.1.129  
changed lines
  Added in v.1.144


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>