Diff for /loncom/homework/response.pm between versions 1.120 and 1.132

version 1.120, 2005/04/07 06:56:22 version 1.132, 2005/12/06 09:29:34
Line 32  use Apache::lonlocal; Line 32  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::response',('responseparam','parameter','dataresponse'));      &Apache::lonxml::register('Apache::response',('responseparam','parameter','dataresponse','customresponse'));
 }  }
   
 sub start_response {  sub start_response {
Line 71  sub start_hintresponse { Line 71  sub start_hintresponse {
     my ($parstack,$safeeval)=@_;      my ($parstack,$safeeval)=@_;
     my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);      my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
     if ($id eq '') { $id = $Apache::lonxml::curdepth; }      if ($id eq '') { $id = $Apache::lonxml::curdepth; }
     push (@Apache::inputtags::response,$id);      push (@Apache::inputtags::hint,$id);
     push (@Apache::inputtags::responselist,$id);      push (@Apache::inputtags::hintlist,$id);
     push (@Apache::inputtags::paramstack,[%Apache::inputtags::params]);      push (@Apache::inputtags::paramstack,[%Apache::inputtags::params]);
     return $id;      return $id;
 }  }
   
 sub end_hintresponse {  sub end_hintresponse {
     pop @Apache::inputtags::response;      pop @Apache::inputtags::hint;
     if (defined($Apache::inputtags::paramstack[-1])) {      if (defined($Apache::inputtags::paramstack[-1])) {
  %Apache::inputtags::params=   %Apache::inputtags::params=
     @{ pop(@Apache::inputtags::paramstack) };      @{ pop(@Apache::inputtags::paramstack) };
Line 94  sub pushrandomnumber { Line 94  sub pushrandomnumber {
  # do nothing   # do nothing
     } else {      } else {
  my @seed=&Math::Random::random_get_seed();   my @seed=&Math::Random::random_get_seed();
  push (@randomseeds,\@seed);   push(@randomseeds,\@seed);
     }      }
     &Apache::response::setrandomnumber();      &Apache::response::setrandomnumber(@_);
 }  }
 sub poprandomnumber {  sub poprandomnumber {
     my $rand_alg=&Apache::lonnet::get_rand_alg();      my $rand_alg=&Apache::lonnet::get_rand_alg();
Line 113  sub poprandomnumber { Line 113  sub poprandomnumber {
 }  }
   
 sub setrandomnumber {  sub setrandomnumber {
       my ($ignore_id2) = @_;
     my $rndseed;      my $rndseed;
     $rndseed=&Apache::structuretags::setup_rndseed();      $rndseed=&Apache::structuretags::setup_rndseed();
     if (!defined($rndseed)) { $rndseed=&Apache::lonnet::rndseed(); }      if (!defined($rndseed)) { $rndseed=&Apache::lonnet::rndseed(); }
     &Apache::lonxml::debug("randseed $rndseed");      &Apache::lonxml::debug("randseed $rndseed");
     #  $rndseed=unpack("%32i",$rndseed);      #  $rndseed=unpack("%32i",$rndseed);
     my $rand_alg=&Apache::lonnet::get_rand_alg();      my $rand_alg=&Apache::lonnet::get_rand_alg();
     my $rndmod;      my ($rndmod,$rndmod2);
   
     my ($id1,$id2,$shift_amt);      my ($id1,$id2,$shift_amt);
     if ($Apache::lonhomework::parsing_a_problem) {      if ($Apache::lonhomework::parsing_a_problem) {
Line 130  sub setrandomnumber { Line 131  sub setrandomnumber {
  $shift_amt=scalar(@Apache::inputtags::responselist);   $shift_amt=scalar(@Apache::inputtags::responselist);
     } elsif ($Apache::lonhomework::parsing_a_task) {      } elsif ($Apache::lonhomework::parsing_a_task) {
  $id1=$Apache::bridgetask::dimension;   $id1=$Apache::bridgetask::dimension;
  if (defined($Apache::bridgetask::instance[-1])) {   if (!$ignore_id2 && defined($Apache::bridgetask::instance[-1])) {
     $id2=$Apache::bridgetask::instance[-1];      $id2=$Apache::bridgetask::instance[-1];
  }   }
  $shift_amt=scalar(@Apache::bridgetask::instance);   $shift_amt=scalar(@Apache::bridgetask::instance);
Line 143  sub setrandomnumber { Line 144  sub setrandomnumber {
     } elsif ($rand_alg eq '64bit3') {      } elsif ($rand_alg eq '64bit3') {
  $rndmod=(&Apache::lonnet::numval2($id1) << 10);   $rndmod=(&Apache::lonnet::numval2($id1) << 10);
  if (defined($id2)) { $rndmod+=&Apache::lonnet::numval2($id2); }   if (defined($id2)) { $rndmod+=&Apache::lonnet::numval2($id2); }
     } else {      } elsif ($rand_alg eq '64bit4') {
  my $shift=(4*$shift_amt)%30;   my $shift=(4*$shift_amt)%30;
  $rndmod=(&Apache::lonnet::numval3($id1) << (($shift+15)%30));   $rndmod=(&Apache::lonnet::numval3($id1) << (($shift+15)%30));
  if (defined($id2)) {   if (defined($id2)) {
     $rndmod+=(&Apache::lonnet::numval3($id2) << $shift );      $rndmod+=(&Apache::lonnet::numval3($id2) << $shift );
  }   }
       } else {
    ($rndmod,$rndmod2)=&Apache::lonnet::digest("$id1,$id2");
     }      }
   
     if ($rndseed =~/([,:])/) {      if ($rndseed =~/([,:])/) {
  my $char=$1;   my $char=$1;
  use integer;   use integer;
  my ($num1,$num2)=split(/\Q$char\E/,$rndseed);   my ($num1,$num2)=split(/\Q$char\E/,$rndseed);
  $num1+=$rndmod;   $num1+=$rndmod;
  $num2+=$rndmod;   $num2+= ((defined($rndmod2)) ? $rndmod2 : $rndmod);
  if($Apache::lonnet::_64bit) { $num1=(($num1<<32)>>32); $num2=(($num2<<32)>>32); }   if($Apache::lonnet::_64bit) { $num1=(($num1<<32)>>32); $num2=(($num2<<32)>>32); }
  $rndseed=$num1.$char.$num2;   $rndseed=$num1.$char.$num2;
     } else {      } else {
Line 358  sub end_dataresponse { Line 362  sub end_dataresponse {
     return $result;      return $result;
 }  }
   
   sub start_customresponse {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       my $id = &Apache::response::start_response($parstack,$safeeval);
       push(@Apache::lonxml::namespace,'customresponse');
       my $result;
       undef($Apache::response::custom_answer);
       &Apache::lonxml::register('Apache::response',('answer'));
       if ($target eq 'web') {
     if (  &Apache::response::show_answer() ) {
       my $answer = &Apache::lonxml::get_param('answerdisplay',$parstack,
      $safeeval);
       $Apache::inputtags::answertxt{$id}=$answer;
    }
       } elsif ($target eq 'edit') {
    $result.=&Apache::edit::tag_start($target,$token);
    $result.=&Apache::edit::text_arg('String to display for answer:',
    'answerdisplay',$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,'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();
       } elsif ($target eq 'meta') {
    $result .= &Apache::response::meta_package_write('customresponse');
       }
       return $result;
   }
   
   sub end_customresponse {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       my $result;
       my $part=$Apache::inputtags::part;
       my $id=$Apache::inputtags::response[-1];
       if ( $target eq 'grade' && &Apache::response::submitted() ) {
    my $response = &Apache::response::getresponse();
    if ( $response =~ /[^\s]/ && 
        $Apache::response::custom_answer_type eq 'loncapa/perl') {
       if (!$Apache::lonxml::default_homework_loaded) {
    &Apache::lonxml::default_homework_load($safeeval);
       }
       my %previous = &Apache::response::check_for_previous($response,
    $part,$id);
       $Apache::lonhomework::results{"resource.$part.$id.submission"}=
    $response;
       my $error;
       ${$safeeval->varglob('LONCAPA::customresponse_submission')}=
    $response;
       
       my $award = &Apache::run::run('{ my $submission=$LONCAPA::customresponse_submission;'.$Apache::response::custom_answer.'}',$safeeval);
       if (!&Apache::inputtags::valid_award($award)) {
    $error = $award;
    $award = 'ERROR';
       }
       &Apache::response::handle_previous(\%previous,$award);
       $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=
    $award;
       if ($error) {
    $Apache::lonhomework::results{"resource.$part.$id.awardmsg"}=
       $error;
       }
    }
       }
       pop(@Apache::lonxml::namespace);
       &Apache::lonxml::deregister('Apache::response',('answer'));
       &Apache::response::end_response();
       return $result;
   }
   
   sub start_answer {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       my $result;
       $Apache::response::custom_answer=
    &Apache::lonxml::get_all_text_unbalanced("/answer",$parser);
       $Apache::response::custom_answer_type=
    lc(&Apache::lonxml::get_param('type',$parstack,$safeeval));
       $Apache::response::custom_answer_type =~ s/\s+//g;
       if ($target eq "edit" ) {
    $result=&Apache::edit::tag_start($target,$token,'Answer algorithm');
    $result.=&Apache::edit::editfield($token->[1],
     $Apache::response::custom_answer,
     '',80,4);
       } elsif ( $target eq "modified" ) {
    $result=$token->[4].&Apache::edit::modifiedfield('/answer',$parser);
       }
       return $result;
   }
   
   sub end_answer {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       if ($target eq 'edit' ) {
    return &Apache::edit::end_table();
       }
   }
   
 sub decide_package {  sub decide_package {
     my ($tagstack)=@_;      my ($tagstack)=@_;
     my $package;      my $package;
Line 488  sub setup_params { Line 592  sub setup_params {
     }      }
 }  }
   
   {
       my @answer_bits;
   
 sub answer_header {  sub answer_header {
     my ($type) = @_;      my ($type) = @_;
     my $result;      my $result;
     if ($env{'form.answer_output_mode'} eq 'tex') {      if ($env{'form.answer_output_mode'} eq 'tex') {
  $result = ' \vskip 0 mm \begin{tabular}{|c|}\hline Answer for Part: \verb|'.   undef(@answer_bits);
                   $Apache::inputtags::part.'| \\\\ \hline ';  
     } else {      } else {
  $result = '<table border="1"><tr><td>Answer for Part:'.   $result  = '<table border="1"><tr>';
     $Apache::inputtags::part. '</td>'."\n";   if ($Apache::lonhomework::type eq 'exam') {
       $result .= '<td>'.$Apache::lonxml::counter. ')</td>';
    } else {
       $result .= '<td>Answer for Part:'.$Apache::inputtags::part.'</td>';
    }
    $result .= "\n";
     }      }
     return $result;      return $result;
 }  }
Line 505  sub answer_part { Line 616  sub answer_part {
     my ($type,$answer) = @_;      my ($type,$answer) = @_;
     my $result;      my $result;
     if ($env{'form.answer_output_mode'} eq 'tex') {      if ($env{'form.answer_output_mode'} eq 'tex') {
  $result = ' \verb|'.$answer.'|\\\\ \hline ';   my $to_use='|';
    foreach my $value (32..126) {
       my $char=pack('c',$value);
       if ($answer !~ /\Q$char\E/) {
    $to_use=$char;
    last;
       }
    }
    if ($answer ne '') {
       push(@answer_bits,'\verb'.$to_use.$answer.$to_use);
    }
     } else {      } else {
  $result = '<td>'.$answer.'</td>';   $result = '<td>'.$answer.'</td>';
     }      }
Line 516  sub answer_footer { Line 637  sub answer_footer {
     my ($type) = @_;      my ($type) = @_;
     my $result;      my $result;
     if ($env{'form.answer_output_mode'} eq 'tex') {      if ($env{'form.answer_output_mode'} eq 'tex') {
  $result = ' \end{tabular} \vskip 0 mm ';   my $columns = scalar(@answer_bits)+1;
    $result = ' \vskip 0 mm \begin{tabular}{|'.'c|'x$columns.'}\hline ';
    if ($Apache::lonhomework::type eq 'exam') {
       $result .= $Apache::lonxml::counter.') ';
    } else {
       $result .= ' Answer for Part: \verb|'.
    $Apache::inputtags::part.'| ';
    }
    foreach my $bit (@answer_bits) {
       $result.=' & '.$bit;
    }
    $result .= ' \\\\ \\hline \end{tabular} \vskip 0 mm ';
     } else {      } else {
  $result = '</tr></table>';   $result = '</tr></table>';
     }      }
     return $result;      return $result;
 }  }
   
   }
   
 sub showallfoils {  sub showallfoils {
     if (defined($env{'form.showallfoils'})) {      if (defined($env{'form.showallfoils'})) {
  my ($symb)=&Apache::lonxml::whichuser();   my ($symb)=&Apache::lonxml::whichuser();
Line 573  sub getresponse { Line 707  sub getresponse {
 sub repetition {  sub repetition {
     my $id = $Apache::inputtags::part;      my $id = $Apache::inputtags::part;
     my $weight = &Apache::lonnet::EXT("resource.$id.weight");      my $weight = &Apache::lonnet::EXT("resource.$id.weight");
     my $repetition = int $weight/9;      if (!defined($weight) || ($weight eq '')) { $weight=1; }
     if ($weight % 9 != 0) {$repetition++;}       my $repetition = int($weight/10);
       if ($weight % 10 != 0) { $repetition++; } 
     return $repetition;      return $repetition;
 }  }
   
Line 583  sub scored_response { Line 718  sub scored_response {
     my $repetition=&repetition();      my $repetition=&repetition();
     my $score=0;      my $score=0;
     for (my $i=0;$i<$repetition;$i++) {      for (my $i=0;$i<$repetition;$i++) {
    # A is 1, B is 2, etc. (get response return 0-9 and then we add 1)
  my $increase=&Apache::response::getresponse($i+1);   my $increase=&Apache::response::getresponse($i+1);
  if ($increase ne '') { $score+=$increase+1; }   if ($increase ne '') { $score+=$increase+1; }
     }      }
Line 738  sub submitted { Line 874  sub submitted {
     # if the Submit Answer button for this particular part was pressed      # if the Submit Answer button for this particular part was pressed
     my $partid=$Apache::inputtags::part;      my $partid=$Apache::inputtags::part;
     if (defined($env{'form.submit_'.$partid})) { return 1; }      if (defined($env{'form.submit_'.$partid})) { return 1; }
       # Submit All button on a .page was pressed
       if (defined($env{'form.all_submit'})) { return 1; }
     # otherwise no submission occured      # otherwise no submission occured
     return 0;      return 0;
 }  }
   
   sub add_to_gradingqueue {
       my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
       if (   $courseid eq ''
    || $symb eq ''
    || $env{'request.state'} eq 'construct') {
    return;
       }
   
       my %queue_info = ( 'type' => 'problem',
          'time' => time);
   
       if (exists($Apache::lonhomework::history{"resource.0.checkedin.slot"})) {
    $queue_info{'slot'}=
        $Apache::lonhomework::history{"resource.0.checkedin.slot"};
       }
   
       my $result=&Apache::bridgetask::add_to_queue('gradingqueue',\%queue_info);
       if ($result ne 'ok') {
    &Apache::lonxml::error("add_to_queue said $result");
       }
   }
   
 # basically undef and 0 (both false) mean that they still have work to do  # basically undef and 0 (both false) mean that they still have work to do
 # and all true values mean that they can't do any more work  # and all true values mean that they can't do any more work
 #  #

Removed from v.1.120  
changed lines
  Added in v.1.132


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