Diff for /loncom/homework/caparesponse/caparesponse.pm between versions 1.126 and 1.139

version 1.126, 2004/02/05 18:41:06 version 1.139, 2004/03/12 16:55:35
Line 29 Line 29
 package Apache::caparesponse;  package Apache::caparesponse;
 use strict;  use strict;
 use capa;  use capa;
   use Apache::lonlocal;
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::caparesponse',('caparesponse','numericalresponse','stringresponse','formularesponse'));      &Apache::lonxml::register('Apache::caparesponse',('caparesponse','numericalresponse','stringresponse','formularesponse'));
Line 132  sub end_numericalresponse { Line 133  sub end_numericalresponse {
  my $hideunit=&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffunit');   my $hideunit=&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffunit');
   
  foreach my $key (keys(%Apache::inputtags::params)) {   foreach my $key (keys(%Apache::inputtags::params)) {
     $expression.= ';my $'. #'      $expression.= ';my $__LC__'. #'
  $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;';      $expression.=';my $__LC__unit=undef;';
  }   }
  #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;';      $expression.=';my $__LC__sig=undef;';
  }   }
   
  if ($tag eq 'formularesponse') {   if ($tag eq 'formularesponse') {
     $expression.=';my $type="fml";';      $expression.=';my $__LC__type="fml";';
  } elsif ($tag eq 'numericalresponse') {   } elsif ($tag eq 'numericalresponse') {
     $expression.=';my $type="float";';      $expression.=';my $__LC__type="float";';
  }   }
  $expression.="');";   $expression.="');";
  my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);   my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
Line 179  sub end_numericalresponse { Line 180  sub end_numericalresponse {
     my $unit=&Apache::lonxml::get_param_var('unit',$parstack,      my $unit=&Apache::lonxml::get_param_var('unit',$parstack,
     $safeeval);      $safeeval);
     if ($target eq 'web') {      if ($target eq 'web') {
  $result="<br />The correct answer is ";   $result="<br />".&mt('The correct answer is')." ";
     }      }
     for (my $i=0; $i <= $#answers; $i++) {      for (my $i=0; $i <= $#answers; $i++) {
  my $answer=$answers[$i];   my $answer=$answers[$i];
Line 254  sub end_numericalresponse { Line 255  sub end_numericalresponse {
  }   }
  if ($tag eq 'numericalresponse') {   if ($tag eq 'numericalresponse') {
     my ($celllength,$number_of_tables,@table_range)=      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 $j=0;
     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 \begin{tabular}{';
  for (my $ind=0;$ind<$table_range[$j];$ind++) {   for (my $ind=0;$ind<$table_range[$j];$ind++) {
     $result.='lp{'.$celllength.' mm}';      $result.='p{3 mm}p{'.$celllength.' mm}';
  }   }
  $result.='}';   $result.='}';
  for (my $ind=$cou;$ind<$cou+$table_range[$j];$ind++) {   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.=' & ';}      if ($ind != $cou+$table_range[$j]-1) {$result.=' & ';}
  }   }
  $cou += $table_range[$j];   $cou += $table_range[$j];
Line 376  sub end_numericalresponse { Line 377  sub end_numericalresponse {
 }  }
   
 sub get_table_sizes {  sub get_table_sizes {
     my ($format,$number_of_bubbles)=@_;      my ($number_of_bubbles,$rbubble_values)=@_;
     my $max_val = 0;      my $scale=2; #mm for one digit
     if ($format=~m/^(\d+)E([^\d]*)(\d*)$/) {      my $cell_width=0;
  $max_val=$1+$2+4;      foreach my $member (@$rbubble_values) {
    my $cell_width_real=0;
    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;
           } elsif ($member=~/(\d*)\.(\d*)/) {
       $cell_width_real=(length($1)+length($2)+3)*$scale;
    } else {
       $cell_width_real=(length($member)+1)*$scale*0.9;
    }
    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 {      } else {
  $max_val=4;   $ENV{'textwidth'}=~/(\d+)\.?(\d*)/;
    $textwidth=$1.'.'.$2;
     }      }
     $max_val = int(0.9*$ENV{'form.textwidth'}/(($max_val+6)*2));      my $bubbles_per_line=int($textwidth/$cell_width);
     my $celllength = 0.9*$ENV{'form.textwidth'}/$max_val-10;      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 @table_range = ();      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,$bubbles_per_line;}
     for (my $i=0;$i<$number_of_tables;$i++) {push @table_range,$max_val;}      if ($number_of_bubbles % $bubbles_per_line) {
     if ($number_of_bubbles % $max_val != 0) {  
  $number_of_tables++;   $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;
       $cell_width=$cell_width*3/4;
       return ($cell_width,$number_of_tables,@table_range);
 }  }
   
 sub format_number {  sub format_number {
Line 441  sub make_numerical_bubbles { Line 462  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;
  }   }
  #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 @factors = (1.13,1.17,1.25,1.33,1.45); #default values of factors
     my @powers = (1..$number_of_bubbles);      my @powers = (1..$number_of_bubbles);
Line 493  sub get_sigrange { Line 522  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 511  sub start_stringresponse { Line 550  sub start_stringresponse {
  [['cs','Case Sensitive'],['ci','Case Insensitive'],   [['cs','Case Sensitive'],['ci','Case Insensitive'],
   ['mc','Case Insensitive, Any Order'],    ['mc','Case Insensitive, Any Order'],
   ['re','Regular Expression']],$token);    ['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();   $result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  my $constructtag;         my $constructtag;
  $constructtag=&Apache::edit::get_new_args($token,$parstack,         $constructtag=&Apache::edit::get_new_args($token,$parstack,
   $safeeval,'answer',                                                   $safeeval,'answer',
   'type');                                                   'type','answerdisplay');
  if ($constructtag) {         if ($constructtag) {
     $result = &Apache::edit::rebuild_tag($token);             $result = &Apache::edit::rebuild_tag($token);
     $result.=&Apache::edit::handle_insert();             $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 535  sub end_stringresponse { Line 576  sub end_stringresponse {
     my $id=$Apache::inputtags::response[-1];      my $id=$Apache::inputtags::response[-1];
     my $answer=&Apache::lonxml::get_param('answer',$parstack,$safeeval);      my $answer=&Apache::lonxml::get_param('answer',$parstack,$safeeval);
     my $type=&Apache::lonxml::get_param('type',$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]);      &Apache::lonxml::debug("current $answer ".$token->[2]);
     if (!$Apache::lonxml::default_homework_loaded) {      if (!$Apache::lonxml::default_homework_loaded) {
  &Apache::lonxml::default_homework_load($safeeval);   &Apache::lonxml::default_homework_load($safeeval);
Line 597  sub end_stringresponse { Line 639  sub end_stringresponse {
  my $status = $Apache::inputtags::status['-1'];   my $status = $Apache::inputtags::status['-1'];
  if (  &Apache::response::show_answer() ) {   if (  &Apache::response::show_answer() ) {
     if ($target eq 'web') {      if ($target eq 'web') {
  $result="<br />The correct answer is ".$answer;   $result=($answerdisplay eq 'inline'?'':"<br />".&mt('The correct answer is')." ")
       .$answer;
 #    join(', ',@answers).".<br />";  #    join(', ',@answers).".<br />";
     }      }
  }   }

Removed from v.1.126  
changed lines
  Added in v.1.139


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