Diff for /loncom/homework/optionresponse.pm between versions 1.51 and 1.111

version 1.51, 2002/10/17 14:30:40 version 1.111, 2004/07/02 08:21:39
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # 2/21 Guy  
 # 01/18 Alex  
 package Apache::optionresponse;  package Apache::optionresponse;
 use strict;  use strict;
 use Apache::response;  use Apache::response();
   use Apache::lonlocal;
   
 BEGIN {  BEGIN {
   &Apache::lonxml::register('Apache::optionresponse',('optionresponse'));    &Apache::lonxml::register('Apache::optionresponse',('optionresponse'));
Line 42  sub start_optionresponse { Line 41  sub start_optionresponse {
   &Apache::lonxml::register('Apache::optionresponse',('foilgroup','foil','conceptgroup'));    &Apache::lonxml::register('Apache::optionresponse',('foilgroup','foil','conceptgroup'));
   push (@Apache::lonxml::namespace,'optionresponse');    push (@Apache::lonxml::namespace,'optionresponse');
   my $id = &Apache::response::start_response($parstack,$safeeval);    my $id = &Apache::response::start_response($parstack,$safeeval);
     %Apache::hint::option=();
     undef(%Apache::response::foilnames);
   if ($target eq 'edit') {    if ($target eq 'edit') {
     $result.=&Apache::edit::start_table($token).      $result.=&Apache::edit::start_table($token).
  "<tr><td>Multiple Option Response Question</td><td>Delete:".   "<tr><td>Multiple Option Response Question ".
    &Apache::loncommon::help_open_topic('Option_Response_Problems')."</td><td>Delete:".
  &Apache::edit::deletelist($target,$token)   &Apache::edit::deletelist($target,$token)
  ."</td><td>&nbsp;".   ."</td><td>&nbsp;".
         &Apache::edit::end_row().          &Apache::edit::end_row().
Line 54  sub start_optionresponse { Line 56  sub start_optionresponse {
      $token,'4').       $token,'4').
         &Apache::edit::select_arg('Randomize Foil Order','randomize',          &Apache::edit::select_arg('Randomize Foil Order','randomize',
   ['yes','no'],$token).    ['yes','no'],$token).
           &Apache::edit::select_arg(&mt('Display of options when printed'),'TeXlayout',
     [['horizontal',&mt('Normal list')],
      ['vertical',&mt('Listed in a vertical column')]],$token).
         &Apache::edit::end_row().&Apache::edit::start_spanning_row();          &Apache::edit::end_row().&Apache::edit::start_spanning_row();
   } elsif ($target eq 'modified') {    } elsif ($target eq 'modified') {
     my $constructtag=&Apache::edit::get_new_args($token,$parstack,      my $constructtag=&Apache::edit::get_new_args($token,$parstack,
  $safeeval,'max','randomize');   $safeeval,'max','randomize',
    'TeXlayout');
     if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }      if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
   } elsif ($target eq 'meta') {    } elsif ($target eq 'meta') {
     $result=&Apache::response::meta_package_write('optionresponse');      $result=&Apache::response::meta_package_write('optionresponse');
   } elsif ($target eq 'analyze') {    } elsif ($target eq 'analyze') {
     my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]";      my $part_id="$Apache::inputtags::part.$id";
     push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id);      push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id);
   }    }
   return $result;    return $result;
Line 75  sub end_optionresponse { Line 81  sub end_optionresponse {
   &Apache::lonxml::deregister('Apache::optionresponse',('foilgroup','foil','conceptgroup'));    &Apache::lonxml::deregister('Apache::optionresponse',('foilgroup','foil','conceptgroup'));
   my $result;    my $result;
   if ($target eq 'edit') { $result=&Apache::edit::end_table(); }    if ($target eq 'edit') { $result=&Apache::edit::end_table(); }
     undef(%Apache::response::foilnames);
   return $result;    return $result;
 }  }
   
Line 85  sub start_foilgroup { Line 92  sub start_foilgroup {
   my $result='';    my $result='';
   %Apache::response::foilgroup=();    %Apache::response::foilgroup=();
   $Apache::optionresponse::conceptgroup=0;    $Apache::optionresponse::conceptgroup=0;
   &Apache::response::setrandomnumber();    &Apache::response::pushrandomnumber();
   if ($target eq 'edit') {    if ($target eq 'edit') {
     my $optionlist="<option></option>\n";      my $optionlist="<option></option>\n";
     my $option;      my $option;
Line 140  ENDTABLE Line 147  ENDTABLE
       $result.=')">';        $result.=')">';
     } # else nothing changed so just use the default mechanism      } # else nothing changed so just use the default mechanism
   }    }
   if ($target eq 'tex') {    if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {
       $result .= ' \begin{enumerate} ';        $result .= ' \renewcommand{\labelenumi}{\Alph{enumi}.}
                      \begin{enumerate} ';
   }    }
   return $result;    return $result;
 }  }
Line 150  sub end_foilgroup { Line 158  sub end_foilgroup {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       
   my $result;    my $result;
   if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') {    if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
         $target eq 'tex' || $target eq 'analyze') {
       my $tex_option_switch=&Apache::lonxml::get_param('texoptions',$parstack,$safeeval);
     my $name;      my $name;
     my @opt;      my @opt;
     eval '@opt ='.&Apache::lonxml::get_param('options',$parstack,$safeeval);      eval '@opt ='.&Apache::lonxml::get_param('options',$parstack,$safeeval);
       my $TeXlayout=&Apache::lonxml::get_param('TeXlayout',$parstack,$safeeval,
        -2,0);
       if ($target eq 'tex' && $tex_option_switch eq 'nochoice') {@opt=();}
     &Apache::lonxml::debug("Options are $#opt");      &Apache::lonxml::debug("Options are $#opt");
     my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2');      my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2');
     my $randomize = &Apache::lonxml::get_param('randomize',$parstack,      my $randomize = &Apache::lonxml::get_param('randomize',$parstack,
        $safeeval,'-2');         $safeeval,'-2');
     if ($target eq 'web' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'tex') {
       $result.=&displayfoils($target,$max,$randomize,@opt);        $result.=&displayfoils($target,$max,$randomize,$TeXlayout,@opt);
     } elsif ( $target eq 'answer') {      } elsif ( $target eq 'answer') {
       $result.=&displayanswers($max,$randomize,@opt);        $result.=&displayanswers($max,$randomize,@opt);
     } elsif ( $target eq 'analyze') {      } elsif ( $target eq 'analyze') {
       my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]";   my @shown = &whichfoils($max,$randomize);
       foreach my $name (@{ $Apache::response::foilgroup{'names'} }) {   &Apache::response::analyze_store_foilgroup(\@shown,
  if (defined($Apache::lonhomework::analyze{"$part_id.foil.value.$name"})) { next; }    ['text','value','location']);
  push (@{ $Apache::lonhomework::analyze{"$part_id.foils"} },$name);   my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]";
  $Apache::lonhomework::analyze{"$part_id.foil.value.$name"} =   push (@{ $Apache::lonhomework::analyze{"$part_id.options"} },@opt);
   $Apache::response::foilgroup{"$name.value"};  
  $Apache::lonhomework::analyze{"$part_id.foil.text.$name"} =  
   $Apache::response::foilgroup{"$name.text"};  
       }  
       push (@{ $Apache::lonhomework::analyze{"$part_id.options"} },@opt);  
       push (@{ $Apache::lonhomework::analyze{"$part_id.shown"} },&whichfoils($max,$randomize));  
     } elsif ( $target eq 'grade') {      } elsif ( $target eq 'grade') {
       if ( defined $ENV{'form.submitted'}) {        if ( defined $ENV{'form.submitted'}) {
  my @whichopt = &whichfoils($max,$randomize);   my @whichopt = &whichfoils($max,$randomize);
  my $temp=1;my $name;   my $temp=1;my $name;
  my %responsehash;   my %responsehash;
    my %grade;
  my $right=0;   my $right=0;
  my $wrong=0;   my $wrong=0;
  my $ignored=0;   my $ignored=0;
  foreach $name (@whichopt) {   foreach $name (@whichopt) {
   my $response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1'].":$temp"};    my $response=&Apache::response::getresponse($temp);
   $responsehash{$name}=$response;    if ($ENV{'form.submitted'} eq 'scantron') {
         $response = $opt[$response];
     }
   if ( $response =~ /[^\s]/) {    if ( $response =~ /[^\s]/) {
       $responsehash{$name}=$response;
     my $value=$Apache::response::foilgroup{$name.'.value'};      my $value=$Apache::response::foilgroup{$name.'.value'};
     &Apache::lonxml::debug("submitted a $response for $value<br />\n");      &Apache::lonxml::debug("submitted a $response for $value<br />\n");
     if ($value eq $response) {$right++;} else {$wrong++;}      if ($value eq $response) {
    $grade{$name}='1'; $right++;
       } else {
    $grade{$name}='0'; $wrong++;
       }
   } else {    } else {
     $ignored++;      $ignored++;
   }    }
Line 197  sub end_foilgroup { Line 212  sub end_foilgroup {
  my $part=$Apache::inputtags::part;   my $part=$Apache::inputtags::part;
  my $id = $Apache::inputtags::response['-1'];   my $id = $Apache::inputtags::response['-1'];
  my $responsestr=&Apache::lonnet::hash2str(%responsehash);   my $responsestr=&Apache::lonnet::hash2str(%responsehash);
    my $gradestr   =&Apache::lonnet::hash2str(%grade);
  my %previous=&Apache::response::check_for_previous($responsestr,   my %previous=&Apache::response::check_for_previous($responsestr,
    $part,$id);     $part,$id);
  &Apache::lonxml::debug("Got $right right and $wrong wrong, and $ignored were ignored");   &Apache::lonxml::debug("Got $right right and $wrong wrong, and $ignored were ignored");
  my $ad;   $Apache::lonhomework::results{"resource.$part.$id.submission"}=
  if ($wrong==0 && $ignored==0) {      $responsestr;
   $ad='EXACT_ANS';   $Apache::lonhomework::results{"resource.$part.$id.submissiongrading"}=$gradestr;
  } elsif ($wrong==0 && $right==0) {  
   #nothing submitted   if (!$Apache::lonhomework::scantronmode) {
       my $ad;
       if ($wrong==0 && $ignored==0) {
    $ad='EXACT_ANS';
       } elsif ($wrong==0 && $right==0) {
    #nothing submitted
       } else {
    if ($ignored==0) {
       $ad='INCORRECT';
    } else {
       $ad='MISSING_ANSWER';
    }
       }
       $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
       &Apache::response::handle_previous(\%previous,$ad);
  } else {   } else {
   if ($ignored==0) {      my $ad;
     $ad='INCORRECT';      if ($wrong==0 && $right==0) {
   } else {   #nothing submitted
     $ad='MISSING_ANSWER';      } else {
   }   $ad='ASSIGNED_SCORE';
       }
       $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
       $Apache::lonhomework::results{"resource.$part.$id.awarded"}=
    $right/(scalar(@whichopt));
       $Apache::lonhomework::results{"resource.$part.$id.numfoils"}=
    scalar(@whichopt);
  }   }
  $Apache::lonhomework::results{"resource.$part.$id.submission"}=  
   $responsestr;  
  $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=  
   $ad;  
  &Apache::response::handle_previous(\%previous,$ad);  
       }        }
     }      }
       &Apache::lonxml::increment_counter(&getfoilcounts($max));
   } elsif ($target eq 'edit') {    } elsif ($target eq 'edit') {
     $result.=&Apache::edit::end_table();      $result.=&Apache::edit::end_table();
   }      }
   if ($target eq 'tex') {$result .= '\end{enumerate}';}    if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {
         $result .= '\end{enumerate}';
     }
     &Apache::response::poprandomnumber();
   return $result;    return $result;
 }  }
   
Line 237  sub getfoilcounts { Line 272  sub getfoilcounts {
 }  }
   
 sub whichfoils {  sub whichfoils {
   my ($max,$randomize)=@_;      my ($max,$randomize)=@_;
   $max = &getfoilcounts($max);      return &Apache::response::whichorder($max,$randomize,
   &Apache::lonxml::debug("randomize $randomize");   &Apache::response::showallfoils(),
   my @names = @{ $Apache::response::foilgroup{'names'} };   \%Apache::response::foilgroup);
   my @whichopt =();  
   my (%top,@toplist,%bottom,@bottomlist);  
   if (!(&Apache::response::showallfoils() || ($randomize eq 'no'))) {  
       my $current=0;  
       foreach my $name (@names) {  
   $current++;  
   if ($Apache::response::foilgroup{$name.'.location'} eq 'top') {  
       $top{$name}=$current;  
   } elsif ($Apache::response::foilgroup{$name.'.location'} eq  
    'bottom') {  
       $bottom{$name}=$current;  
   }  
       }  
   }  
   while ((($#whichopt+1) < $max) && ($#names > -1)) {  
     &Apache::lonxml::debug("Have $#whichopt max is $max");  
     my $aopt;  
     if (&Apache::response::showallfoils() || ($randomize eq 'no')) {  
       $aopt=0;  
     } else {  
       $aopt=int(&Math::Random::random_uniform() * ($#names+1));  
     }  
     &Apache::lonxml::debug("From $#whichopt $max $#names elms, picking $aopt");  
     $aopt=splice(@names,$aopt,1);  
     &Apache::lonxml::debug("Picked $aopt");  
     if ($top{$aopt}) {  
  $toplist[$top{$aopt}]=$aopt;  
     } elsif ($bottom{$aopt}) {  
  $bottomlist[$bottom{$aopt}]=$aopt;  
     } else {  
  push (@whichopt,$aopt);  
     }  
   }  
   for (my $i=0;$i<=$#toplist;$i++) {  
       if ($toplist[$i]) { unshift(@whichopt,$toplist[$i]) }  
   }  
   for (my $i=0;$i<=$#bottomlist;$i++) {  
       if ($bottomlist[$i]) { push(@whichopt,$bottomlist[$i]) }  
   }  
   
   return @whichopt;  
 }  }
   
 sub displayanswers {  sub displayanswers {
   my ($max,$randomize,@opt)=@_;    my ($max,$randomize,@opt)=@_;
     if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;}
   my @names = @{ $Apache::response::foilgroup{'names'} };    my @names = @{ $Apache::response::foilgroup{'names'} };
   my @whichopt = &whichfoils($max,$randomize);    my @whichopt = &whichfoils($max,$randomize);
   my $result=&Apache::response::answer_header('optionresponse');    my $result=&Apache::response::answer_header('optionresponse');
Line 297  sub displayanswers { Line 292  sub displayanswers {
   return $result;    return $result;
 }  }
   
   sub check_for_invalid {
       my ($names,$options) = @_;
       my %bad_names;
       foreach my $name (@{ $names }) {
    my $value=$Apache::response::foilgroup{$name.'.value'};
    my $found=0;
    foreach my $option (@{ $options }) {
       if ($value eq $option) { $found=1; }
    }
    if (!$found) { $bad_names{$name}=$value; }
       }
       if (%bad_names) {
    my $error=&mt('The question can not be gotten correct, '.
       'the following foils in the &lt;optionresponse&gt; '.
       'have invalid correct options').' <br /><tt>'.
       join('<br />',(map { $_=&mt("[_1] with value [_2]",$_,$bad_names{$_}) } (keys(%bad_names)))).
       "</tt>";
    &Apache::lonxml::error($error);
       }
   }
   
 sub displayfoils {  sub displayfoils {
   my ($target,$max,$randomize,@opt)=@_;    my ($target,$max,$randomize,$TeXlayout,@opt)=@_;
     if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;}
   my @names = @{ $Apache::response::foilgroup{'names'} };    my @names = @{ $Apache::response::foilgroup{'names'} };
   my @truelist;    my @truelist;
   my @falselist;    my @falselist;
   my $result;    my $result;  
   my $name;    my $name;
   my $displayoptionintex=0;    my $displayoptionintex=1;
   my @alphabet = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',    my @alphabet = ('A'..'Z');
   'Q','R','S','T','U','V','W','X','Y','Z');  
   my @whichopt = &whichfoils($max,$randomize);    my @whichopt = &whichfoils($max,$randomize);
     &check_for_invalid(\@whichopt,\@opt);
   my $part=$Apache::inputtags::part;    my $part=$Apache::inputtags::part;
   my $id=$Apache::inputtags::response[-1];    my $id=$Apache::inputtags::response[-1];
   if (($Apache::lonhomework::history{"resource.$part.solved"} =~ /^correct/)  || ($Apache::inputtags::status[-1] eq  'SHOW_ANSWER')) {    my $break;
     my $solved=$Apache::lonhomework::history{"resource.$part.solved"};
     if ( ($target ne 'tex') &&
          &Apache::response::show_answer() ) {
       my $temp=1;
     foreach $name (@whichopt) {      foreach $name (@whichopt) {
       if ($target eq 'web') {   my $text=$Apache::response::foilgroup{$name.'.text'};
   $result.="<br />";   my %lastresponse=&Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"});
       } elsif ($target eq 'tex') {   my $lastopt=$lastresponse{$name};
   $result.='\vskip 0 mm ';   if ($text!~/^\s*$/) { $break='<br />'; }
    $result.=$break;
    if ($target eq 'web') {
       my $value=$Apache::response::foilgroup{$name.'.value'};
       if (!($text=~s|<drawoptionlist\s*/>|$value|)) {
    if ($text=~/^\s*$/) {
       $text=$value.$text;
    } else {
       $text=$value.': '.$text;
    }
       } else {
    $text='&#149;'.$text;
       }
       $result.=$text."\n";
       }        }
       if ($target ne 'tex') {        if ($Apache::lonhomework::type eq 'exam') {
   $result .=$Apache::response::foilgroup{$name.'.value'}.    $result.=&webbubbles(\@opt,\@alphabet,$temp,$lastopt);
       ":".$Apache::response::foilgroup{$name.'.text'}."\n";  
       } else {  
    $result .='\item '.$Apache::response::foilgroup{$name.'.value'}.  
       ":".$Apache::response::foilgroup{$name.'.text'}."\n";  
       }        }
         $temp++;
     }      }
   } else {    } else {
     my $temp=1;      my $temp=1;
     my %lastresponse=&Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"});      my %lastresponse=&Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"});
       my $internal_counter=$Apache::lonxml::counter;
     foreach $name (@whichopt) {      foreach $name (@whichopt) {
         my $text=$Apache::response::foilgroup{$name.'.text'};
         if ($text!~/^\s*$/) {
     if ($target eq 'tex') {
         $break='\vskip 0 mm ';
     } elsif ($target eq 'web') {
         $break='<br />';
     }
         }
       my $lastopt=$lastresponse{$name};        my $lastopt=$lastresponse{$name};
       my $optionlist="<option></option>\n";        my $optionlist="<option></option>\n";
       my $option;        my $option;
Line 340  sub displayfoils { Line 380  sub displayfoils {
  }   }
       }        }
       if ($target ne 'tex') {        if ($target ne 'tex') {
   $result.="<br /><select name=\"HWVAL_$Apache::inputtags::response['-1']:$temp\">"    if ($Apache::lonhomework::type ne 'exam') {
       .$optionlist        $optionlist='<select name="HWVAL_'.
   ."</select>\n".$Apache::response::foilgroup{$name.'.text'}."\n";    $Apache::inputtags::response['-1'].':'.$temp.'">'.
     $optionlist."</select>\n";
     } else {
         $optionlist='<u>'.('&nbsp;'x10).'</u>';
     }
     if ($text=~s|<drawoptionlist\s*/>|$optionlist|) {
         if ($Apache::lonhomework::type ne 'exam') {
     $text='&#149;'.$text;
         }
     } else {
         if ($Apache::lonhomework::type ne 'exam') {
     $text=$optionlist.$text;
         }
     }
     $result.=$break.$text."\n";
   if ($Apache::lonhomework::type eq 'exam') {    if ($Apache::lonhomework::type eq 'exam') {
   my $number_of_bubbles = $#opt + 1;        $result.=&webbubbles(\@opt,\@alphabet,$temp,$lastopt);
   $result.= '<table border="1"><tr>';  
   for (my $ind=0;$ind<$number_of_bubbles;$ind++) {  
       $result.='<td>'.$alphabet[$ind].': '.$opt[$ind].'</td>';  
   }  
   $result.='</tr></table>';  
   }    }
   $temp++;    $temp++;
       } else {        } else {
   if ($displayoptionintex == 0) {    my $texoptionlist='';
               my $texoptionlist = &optionlist_correction($optionlist);    if ($displayoptionintex &&
       if ($Apache::lonhomework::type eq 'exam') {$texoptionlist='';}        $Apache::lonhomework::type ne 'exam') {
       if ($Apache::response::foilgroup{$name.'.text'}=~m/\\item /) {        $texoptionlist = &optionlist_correction($TeXlayout,@opt);
   if ($Apache::lonhomework::type eq 'exam') {    }
       $Apache::response::foilgroup{$name.'.text'}=~s/\\item/\\item[\\textbf{$Apache::lonxml::counter}\.]/;    if ($text=~/<drawoptionlist\s*\/>/) {
   }        $text=~s|<drawoptionlist\s*/>| \\makebox\[0\.3in\]\[b\]\{\\hrulefill\} |;
   $result.= $texoptionlist.$Apache::response::foilgroup{$name.'.text'};    }
       } else {  
   if ($Apache::lonhomework::type eq 'exam') {    if ($text=~m/\\item /) {
       $result.= $texoptionlist.'\item[\textbf{'.$Apache::lonxml::counter.'}.]'.$Apache::response::foilgroup{$name.'.text'};  
   } else {  
       $result.= $texoptionlist.'\item '.$Apache::response::foilgroup{$name.'.text'};  
   }  
       }  
       if ($Apache::lonhomework::type eq 'exam') {        if ($Apache::lonhomework::type eq 'exam') {
   $result.=&bubbles(\@alphabet,\@opt);            $text=~s/\\item/\\vskip 2 mm/;
       }        }
       $displayoptionintex=1;        $result.= $texoptionlist.$text;
   } else {    } else {
       if ($Apache::response::foilgroup{$name.'.text'}=~m/\\item /) {  
   if ($Apache::lonhomework::type eq 'exam') {  
       $Apache::response::foilgroup{$name.'.text'}=~s/\\item/\\item[\\textbf{$Apache::lonxml::counter}\.]/;  
   }  
   $result.= $Apache::response::foilgroup{$name.'.text'};  
       } else {  
   if ($Apache::lonhomework::type eq 'exam') {  
       $result.= '\item[\textbf{'.$Apache::lonxml::counter.'}.]'.$Apache::response::foilgroup{$name.'.text'};  
   } else {  
       $result.= '\item '.$Apache::response::foilgroup{$name.'.text'};  
   }  
       }  
       if ($Apache::lonhomework::type eq 'exam') {        if ($Apache::lonhomework::type eq 'exam') {
   $result.=&bubbles(\@alphabet,\@opt);    $result.= $texoptionlist.'  '.$text;
         } else {
     if ($text=~/\S/) {$result.= $texoptionlist.'\vspace*{-2 mm}\item '.$text;} else {$result.= $texoptionlist;}
       }        }
   }    }
       }     if ($Apache::lonhomework::type eq 'exam') {
         $result.='\vskip -1 mm\noindent\begin{enumerate}\item[\textbf{'.
     $internal_counter.'}.]'.&bubbles(\@alphabet,\@opt).
     '\end{enumerate} \vskip -8 mm \strut ';
         $internal_counter++;
     }
     $displayoptionintex=0;
         }
     }      }
   }   
   if ($target ne 'tex') {  
       return $result."<br />";  
   }    }
   else {    if ($target ne 'tex') {
         return $result.$break;
     } else {
       return $result;        return $result;
   }    }
 }  }
   
   
 sub optionlist_correction {  sub optionlist_correction {
       my ($TeXlayout,@options) = @_;
     my $texoptionlist = shift;      my $texoptionlist='\\item [] Choices: ';
     $texoptionlist =~ s/<option><\/option>/\\item \[\] Possible answers are:/;      if ($TeXlayout eq 'vertical') {$texoptionlist='\\item []';}
     $texoptionlist =~ s/<option>/\{\\bf /g;      if (scalar(@options) > 0) {
     $texoptionlist =~ s/<option selected="on">/\{\\bf /g;   foreach my $option (@options) {
     $texoptionlist =~ s/<\/option>/\},/g;      $texoptionlist.='{\bf '.
     $texoptionlist =~ s/,$/\./g;   &Apache::lonxml::latex_special_symbols($option).
     $texoptionlist =~ s/>/\$>\$/g;   '}';
     $texoptionlist =~ s/</\$<\$/g;      if ($TeXlayout eq 'vertical') {
     $texoptionlist =~ s/=/\$=\$/g;   $texoptionlist.=' \vskip 0 mm ',
       } else {
    $texoptionlist.=',';
       }
    }
    chop($texoptionlist);
    if ($TeXlayout ne 'vertical') {$texoptionlist.='.';}
       } else {
    if ($TeXlayout ne 'vertical') {$texoptionlist='\\item [] \\vskip -5 mm';}
       }
     return $texoptionlist;      return $texoptionlist;
 }  }
   
   
 sub bubbles {  sub webbubbles {
       my ($ropt,$ralphabet,$temp,$lastopt)=@_;
       my @opt=@$ropt; 
       my @alphabet=@$ralphabet;
       my $result='';
       my $number_of_bubbles = $#opt + 1;
       $result.= '<table border="1"><tr>';
       for (my $ind=0;$ind<$number_of_bubbles;$ind++) {
    my $checked='';
    if ($lastopt eq $opt[$ind]) {
       $checked=' checked="on" ';
    }
    $result.='<td><input type="radio" name="HWVAL_'.
       $Apache::inputtags::response['-1'].':'.$temp.
       '" value="'.$opt[$ind].'" '.$checked.' />';
    if ($alphabet[$ind]) {
       $result.=$alphabet[$ind].': ';
    }
    $result.=$opt[$ind].'</td>';
       }
       $result.='</tr></table>';
       return $result;
   }
   
   
   sub bubbles {
     my ($ralphabit,$ropt) = @_;      my ($ralphabit,$ropt) = @_;
     my @alphabet = @$ralphabit;      my @alphabet = @$ralphabit;
     my @opt = @$ropt;      my @opt = @$ropt;
     my ($result,$head,$line) =('','','');      my ($result,$head,$line) =('','','');
     my $number_of_bubbles = $#opt + 1;      my $number_of_bubbles = $#opt + 1;
     my $current_length = 0;      my $current_length = 0;
       my $textwidth;
       if ($ENV{'form.textwidth'} ne '') {
    $ENV{'form.textwidth'}=~/(\d+)/;
    $textwidth=$1;
       } else {
    $ENV{'textwidth'}=~/(\d*)\.?(\d*)/;
    $textwidth=$1.'.'.$2;
       }
     for (my $ind=0;$ind<=$number_of_bubbles;$ind++) {      for (my $ind=0;$ind<=$number_of_bubbles;$ind++) {
  $current_length += (length($opt[$ind])+length($alphabet[$ind])+2)*2;   my $leftmargin;
  if ($current_length<80 and $ind!=$number_of_bubbles) {   $opt[$ind]=&Apache::lonxml::latex_special_symbols($opt[$ind]);
    if ($ind==0) {$leftmargin=6;} else {$leftmargin=10;}
    $current_length += (length($opt[$ind])+length($alphabet[$ind])+4)*2;
    if ($current_length<($textwidth-$leftmargin) and $ind!=$number_of_bubbles) {
     $line.='\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';      $line.='\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';
     $head.='lr';      $head.='lr';
  } else {   } else {
     $line=~s/\&\s*$//;      $line=~s/\&\s*$//;
     $result.='\vskip -5 mm\begin{tabular}{'.$head.'}\\\\'.$line.'\\\\\end{tabular}';      $result.='\vskip -2 mm\noindent\begin{tabular}{'.$head.'}'.$line.'\\\\\end{tabular}\vskip 0 mm';
     $line = '\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';;      $line = '\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';;
     $head ='lr';      $head ='lr';
     $current_length = (length($opt[$ind])+length($alphabet[$ind]))*2;      $current_length = (length($opt[$ind])+length($alphabet[$ind]))*2;
  }   }
   
     }      }
     $Apache::lonxml::counter++;  
     my %moreenv;  
     $moreenv{'form.counter'}=$Apache::lonxml::counter;  
     &Apache::lonnet::appenv(%moreenv);  
     return $result;      return $result;
 }  }
   
Line 467  sub end_conceptgroup { Line 547  sub end_conceptgroup {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   $Apache::optionresponse::conceptgroup=0;    $Apache::optionresponse::conceptgroup=0;
   my $result='';    my $result='';
   if ($target eq 'web' || $target eq 'grade' || $target eq 'answer'    if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
       || $target eq 'tex' || $target eq 'analyze') {        $target eq 'tex' || $target eq 'analyze') {
     #if not there aren't any foils to display and thus no question      #if not there aren't any foils to display and thus no question
     if (defined(@{ $Apache::response::conceptgroup{'names'} })) {        &Apache::response::pick_foil_for_concept($target,
       my @names = @{ $Apache::response::conceptgroup{'names'} };         ['value','text','location'],
       my $pick=int(&Math::Random::random_uniform() * ($#names+1));         \%Apache::hint::option,
       my $name=$names[$pick];         $parstack,$safeeval);
       push @{ $Apache::response::foilgroup{'names'} }, $name;  
       $Apache::response::foilgroup{"$name.value"} =  
  $Apache::response::conceptgroup{"$name.value"};  
       $Apache::response::foilgroup{"$name.text"} =  
  $Apache::response::conceptgroup{"$name.text"};  
       $Apache::response::foilgroup{"$name.location"} =  
  $Apache::response::conceptgroup{"$name.location"};  
       my $concept = &Apache::lonxml::get_param('concept',$parstack,$safeeval);  
       $Apache::response::foilgroup{"$name.concept"} = $concept;  
       &Apache::lonxml::debug("Selecting $name in $concept");  
       if ($target eq 'analyze') {  
  my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]";  
         push (@{ $Apache::lonhomework::analyze{"$part_id.concepts"} },  
       $concept);  
  $Apache::lonhomework::analyze{"$part_id.concept.$concept"}=  
   $Apache::response::conceptgroup{'names'};  
  foreach my $name (@{ $Apache::response::conceptgroup{'names'} }) {  
   push (@{ $Apache::lonhomework::analyze{"$part_id.foils"} },  
  $name);  
   $Apache::lonhomework::analyze{"$part_id.foil.value.$name"} =  
     $Apache::response::conceptgroup{"$name.value"};  
   $Apache::lonhomework::analyze{"$part_id.foil.text.$name"} =  
     $Apache::response::conceptgroup{"$name.text"};  
   $Apache::lonhomework::analyze{"$part_id.foil.location.$name"} =  
     $Apache::response::conceptgroup{"$name.location"};  
  }  
       }  
     }  
   } elsif ($target eq 'edit') {    } elsif ($target eq 'edit') {
     $result=&Apache::edit::end_table();      $result=&Apache::edit::end_table();
   }    }
Line 517  sub start_foil { Line 569  sub start_foil {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $result='';    my $result='';
   if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze' ) {    if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze' ) {
     &Apache::lonxml::startredirection;        &Apache::lonxml::startredirection;
         if ($target eq 'analyze') {
     &Apache::response::check_if_computed($token,$parstack,$safeeval,'value');
         }
   } elsif ($target eq 'edit') {    } elsif ($target eq 'edit') {
     $result=&Apache::edit::tag_start($target,$token,"Foil");      $result=&Apache::edit::tag_start($target,$token,"Foil");
     my $level='-2';      my $level='-2';
Line 546  sub end_foil { Line 601  sub end_foil {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $text ='';    my $text ='';
   my $result = '';    my $result = '';
   if ($target eq 'web' || $target eq 'tex') {     if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { 
       $text=&Apache::lonxml::endredirection;        $text=&Apache::lonxml::endredirection;
       if ($target eq 'tex') { $text = '\item '.$text; }        $text=~/(\w)/;
         if (($target eq 'tex') and ($Apache::lonhomework::type ne 'exam') and ($text=~/\S/)) {$text = '\vspace*{-2 mm}\item '.$text;} 
   }    }
   if ($target eq 'web' || $target eq 'grade' || $target eq 'answer'     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' 
       || $target eq 'tex' || $target eq 'analyze') {        || $target eq 'tex' || $target eq 'analyze') {
     my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval);      my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval);
     if ($value ne 'unused') {      if ($value ne 'unused') {
       my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);        my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
       my $location =&Apache::lonxml::get_param('location',$parstack,$safeeval);  
       &Apache::lonxml::debug("Got a name of :$name:");        &Apache::lonxml::debug("Got a name of :$name:");
       if (!$name) { $name=$Apache::lonxml::curdepth; }        if (!$name) { $name=$Apache::lonxml::curdepth; }
       &Apache::lonxml::debug("Using a name of :$name:");        &Apache::lonxml::debug("Using a name of :$name:");
         if (defined($Apache::response::foilnames{$name})) {
     &Apache::lonxml::error(&mt("Foil name <b><tt>[_1]</tt></b> appears more than once. Foil names need to be unique.",$name));
         }
         $Apache::response::foilnames{$name}++;
         my $location =&Apache::lonxml::get_param('location',$parstack,$safeeval);
       if ( $Apache::optionresponse::conceptgroup        if ( $Apache::optionresponse::conceptgroup
    && !&Apache::response::showallfoils() ) {     && !&Apache::response::showallfoils() ) {
  push @{ $Apache::response::conceptgroup{'names'} }, $name;   push @{ $Apache::response::conceptgroup{'names'} }, $name;
  $Apache::response::conceptgroup{"$name.value"} = $value;   $Apache::response::conceptgroup{"$name.value"} = $value;
  $Apache::response::conceptgroup{"$name.text"} = $text;   if ($target eq 'tex' and $Apache::lonhomework::type eq 'exam') {
       $Apache::response::conceptgroup{"$name.text"} = '\vskip 4 mm $\triangleright$ '.$text;
    } else {
       $Apache::response::conceptgroup{"$name.text"} = $text;
    }
  $Apache::response::conceptgroup{"$name.location"} = $location;   $Apache::response::conceptgroup{"$name.location"} = $location;
       } else {        } else {
  push @{ $Apache::response::foilgroup{'names'} }, $name;   push @{ $Apache::response::foilgroup{'names'} }, $name;
  $Apache::response::foilgroup{"$name.value"} = $value;   $Apache::response::foilgroup{"$name.value"} = $value;
  $Apache::response::foilgroup{"$name.text"} = $text;   if ($target eq 'tex' and $Apache::lonhomework::type eq 'exam') {
       $Apache::response::foilgroup{"$name.text"} = '\vskip 5 mm $\triangleright$ '.$text;
    } else {
       $Apache::response::foilgroup{"$name.text"} = $text;
    }
  $Apache::response::foilgroup{"$name.location"} = $location;   $Apache::response::foilgroup{"$name.location"} = $location;
       }        }
     }      }

Removed from v.1.51  
changed lines
  Added in v.1.111


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.