Annotation of loncom/homework/optionresponse.pm, revision 1.102

1.46      sakharuk    1: # LearningOnline Network with CAPA
1.22      albertel    2: # option list style responses
1.27      albertel    3: #
1.102   ! sakharuk    4: # $Id: optionresponse.pm,v 1.101 2004/02/19 19:06:35 albertel Exp $
1.27      albertel    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
1.1       albertel   28: package Apache::optionresponse;
                     29: use strict;
1.6       albertel   30: use Apache::response;
1.1       albertel   31: 
1.31      harris41   32: BEGIN {
1.1       albertel   33:   &Apache::lonxml::register('Apache::optionresponse',('optionresponse'));
                     34: }
                     35: 
                     36: sub start_optionresponse {
1.22      albertel   37:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                     38:   my $result='';
1.29      albertel   39:   #when in a option response use these
1.22      albertel   40:   &Apache::lonxml::register('Apache::optionresponse',('foilgroup','foil','conceptgroup'));
                     41:   push (@Apache::lonxml::namespace,'optionresponse');
                     42:   my $id = &Apache::response::start_response($parstack,$safeeval);
1.57      albertel   43:   %Apache::hint::option=();
1.22      albertel   44:   if ($target eq 'edit') {
1.23      albertel   45:     $result.=&Apache::edit::start_table($token).
1.98      www        46: 	"<tr><td>Multiple Option Response Question ".
                     47: 	&Apache::loncommon::help_open_topic('Option_Response_Problems')."</td><td>Delete:".
1.23      albertel   48: 	&Apache::edit::deletelist($target,$token)
1.30      matthew    49: 	."</td><td>&nbsp;".
                     50:         &Apache::edit::end_row().
                     51:         &Apache::edit::start_spanning_row().
                     52:         "\n";
1.48      albertel   53:     $result.=&Apache::edit::text_arg('Max Number Of Shown Foils:','max',
                     54: 				     $token,'4').
                     55:         &Apache::edit::select_arg('Randomize Foil Order','randomize',
                     56: 				  ['yes','no'],$token).
                     57:         &Apache::edit::end_row().&Apache::edit::start_spanning_row();
1.34      albertel   58:   } elsif ($target eq 'modified') {
1.23      albertel   59:     my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.48      albertel   60: 						 $safeeval,'max','randomize');
1.22      albertel   61:     if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.34      albertel   62:   } elsif ($target eq 'meta') {
1.23      albertel   63:     $result=&Apache::response::meta_package_write('optionresponse');
1.34      albertel   64:   } elsif ($target eq 'analyze') {
1.93      albertel   65:     my $part_id="$Apache::inputtags::part.$id";
1.34      albertel   66:     push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id);
1.22      albertel   67:   }
                     68:   return $result;
1.1       albertel   69: }
                     70: 
                     71: sub end_optionresponse {
1.22      albertel   72:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                     73:   &Apache::response::end_response;
                     74:   pop @Apache::lonxml::namespace;
1.29      albertel   75:   &Apache::lonxml::deregister('Apache::optionresponse',('foilgroup','foil','conceptgroup'));
1.22      albertel   76:   my $result;
                     77:   if ($target eq 'edit') { $result=&Apache::edit::end_table(); }
                     78:   return $result;
1.1       albertel   79: }
                     80: 
1.44      albertel   81: %Apache::response::foilgroup=();
1.1       albertel   82: sub start_foilgroup {
1.22      albertel   83:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                     84: 
                     85:   my $result='';
1.44      albertel   86:   %Apache::response::foilgroup=();
1.22      albertel   87:   $Apache::optionresponse::conceptgroup=0;
                     88:   &Apache::response::setrandomnumber();
                     89:   if ($target eq 'edit') {
                     90:     my $optionlist="<option></option>\n";
                     91:     my $option;
                     92:     my @opt;
                     93:     eval '@opt ='. &Apache::lonxml::get_param('options',$parstack,$safeeval);
                     94:     my $count=1;
                     95:     foreach $option (@opt) {
                     96:       $optionlist.="<option value=\"$count\">$option</option>\n";
                     97:       $count++;
                     98:     }
                     99:     my $insertlist=&Apache::edit::insertlist($target,$token);
                    100:     $result.=&Apache::edit::start_table($token);
                    101:     $result.= (<<ENDTABLE);
                    102:       <tr><td>Select Options</td>
1.13      albertel  103:         <td>
                    104: 	  Add new Option: <input type="text" name="$Apache::lonxml::curdepth.options" />
                    105:         </td>
                    106:         <td>Delete an Option:
                    107: 	  <select name="$Apache::lonxml::curdepth.deleteopt">$optionlist</select>
                    108: ENDTABLE
1.30      matthew   109:     $result.= &Apache::edit::end_row();
                    110:     $result.= &Apache::edit::start_spanning_row();
                    111:     $result.= $insertlist.'<br />';
1.22      albertel  112:   }
                    113:   if ($target eq 'modified') {
                    114:     my @options;
                    115:     my $optchanged=0;
                    116:     eval '@options ='.&Apache::lonxml::get_param('options',$parstack,$safeeval);
                    117:     if ($ENV{"form.$Apache::lonxml::curdepth.deleteopt"}) {
                    118:       my $delopt=$ENV{"form.$Apache::lonxml::curdepth.deleteopt"};
                    119:       &Apache::lonxml::debug("Deleting :$delopt:");
                    120:       splice(@options,$delopt-1,1);
                    121:       $optchanged=1;
                    122:     }
                    123:     if ($ENV{"form.$Apache::lonxml::curdepth.options"}) {
                    124:       my $newopt = $ENV{"form.$Apache::lonxml::curdepth.options"};
                    125:       if ($options[0]) {
                    126: 	push(@options,$newopt);
                    127:       } else {
                    128: 	$options[0]=$newopt;
                    129:       }
                    130:       $optchanged=1;
                    131:     }
                    132:     if ($optchanged) {
                    133:       $result = "<foilgroup options=\"(";
                    134:       foreach my $option (@options) {
1.41      albertel  135: 	$option=~s/\'/\\\'/g;
1.22      albertel  136: 	&Apache::lonxml::debug("adding option :$option:");
                    137: 	$result .="'".$option."',";
                    138:       }
                    139:       chop $result;
                    140:       $result.=')">';
                    141:     } # else nothing changed so just use the default mechanism
                    142:   }
1.68      sakharuk  143:   if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {
1.42      sakharuk  144:       $result .= ' \begin{enumerate} ';
                    145:   }
1.22      albertel  146:   return $result;
1.1       albertel  147: }
                    148: 
                    149: sub end_foilgroup {
1.22      albertel  150:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    151:   
                    152:   my $result;
1.94      albertel  153:   if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
                    154:       $target eq 'tex' || $target eq 'analyze') {
1.81      sakharuk  155:     my $tex_option_switch=&Apache::lonxml::get_param('texoptions',$parstack,$safeeval);
1.22      albertel  156:     my $name;
                    157:     my @opt;
                    158:     eval '@opt ='.&Apache::lonxml::get_param('options',$parstack,$safeeval);
1.81      sakharuk  159:     if ($target eq 'tex' && $tex_option_switch eq 'nochoice') {@opt=();}
1.22      albertel  160:     &Apache::lonxml::debug("Options are $#opt");
1.48      albertel  161:     my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2');
                    162:     my $randomize = &Apache::lonxml::get_param('randomize',$parstack,
                    163: 					       $safeeval,'-2');
1.32      sakharuk  164:     if ($target eq 'web' || $target eq 'tex') {
1.48      albertel  165:       $result.=&displayfoils($target,$max,$randomize,@opt);
1.25      albertel  166:     } elsif ( $target eq 'answer') {
1.48      albertel  167:       $result.=&displayanswers($max,$randomize,@opt);
1.34      albertel  168:     } elsif ( $target eq 'analyze') {
1.93      albertel  169: 	my @shown = &whichfoils($max,$randomize);
1.94      albertel  170: 	&Apache::response::analyze_store_foilgroup(\@shown,
                    171: 						  ['text','value','location']);
1.93      albertel  172: 	my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]";
                    173: 	push (@{ $Apache::lonhomework::analyze{"$part_id.options"} },@opt);
1.22      albertel  174:     } elsif ( $target eq 'grade') {
                    175:       if ( defined $ENV{'form.submitted'}) {
1.48      albertel  176: 	my @whichopt = &whichfoils($max,$randomize);
1.22      albertel  177: 	my $temp=1;my $name;
1.26      albertel  178: 	my %responsehash;
1.57      albertel  179: 	my %grade;
1.22      albertel  180: 	my $right=0;
                    181: 	my $wrong=0;
                    182: 	my $ignored=0;
                    183: 	foreach $name (@whichopt) {
1.74      albertel  184: 	  my $response=&Apache::response::getresponse($temp);
                    185: 	  if ($ENV{'form.submitted'} eq 'scantron') {
                    186: 	      $response = $opt[$response];
                    187: 	  }
1.22      albertel  188: 	  if ( $response =~ /[^\s]/) {
1.96      albertel  189: 	    $responsehash{$name}=$response;
1.22      albertel  190: 	    my $value=$Apache::response::foilgroup{$name.'.value'};
1.34      albertel  191: 	    &Apache::lonxml::debug("submitted a $response for $value<br />\n");
1.57      albertel  192: 	    if ($value eq $response) {
                    193: 		$grade{$name}='1'; $right++;
                    194: 	    } else {
                    195: 		$grade{$name}='0'; $wrong++;
                    196: 	    }
1.22      albertel  197: 	  } else {
                    198: 	    $ignored++;
                    199: 	  }
                    200: 	  $temp++;
                    201: 	}
1.28      albertel  202: 	my $part=$Apache::inputtags::part;
1.22      albertel  203: 	my $id = $Apache::inputtags::response['-1'];
1.28      albertel  204: 	my $responsestr=&Apache::lonnet::hash2str(%responsehash);
1.57      albertel  205: 	my $gradestr   =&Apache::lonnet::hash2str(%grade);
1.28      albertel  206: 	my %previous=&Apache::response::check_for_previous($responsestr,
                    207: 							   $part,$id);
1.22      albertel  208: 	&Apache::lonxml::debug("Got $right right and $wrong wrong, and $ignored were ignored");
1.75      albertel  209: 	$Apache::lonhomework::results{"resource.$part.$id.submission"}=
                    210: 	    $responsestr;
                    211: 	$Apache::lonhomework::results{"resource.$part.$id.submissiongrading"}=$gradestr;
                    212: 	
                    213: 	if (!$Apache::lonhomework::scantronmode) {
                    214: 	    my $ad;
                    215: 	    if ($wrong==0 && $ignored==0) {
                    216: 		$ad='EXACT_ANS';
                    217: 	    } elsif ($wrong==0 && $right==0) {
                    218: 		#nothing submitted
                    219: 	    } else {
                    220: 		if ($ignored==0) {
                    221: 		    $ad='INCORRECT';
                    222: 		} else {
                    223: 		    $ad='MISSING_ANSWER';
                    224: 		}
                    225: 	    }
                    226: 	    $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
                    227: 	    &Apache::response::handle_previous(\%previous,$ad);
1.22      albertel  228: 	} else {
1.75      albertel  229: 	    my $ad;
                    230: 	    if ($wrong==0 && $right==0) {
                    231: 		#nothing submitted
                    232: 	    } else {
                    233: 		$ad='ASSIGNED_SCORE';
                    234: 	    }
                    235: 	    $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
                    236: 	    $Apache::lonhomework::results{"resource.$part.$id.awarded"}=
                    237: 		$right/(scalar(@whichopt));
1.76      albertel  238: 	    $Apache::lonhomework::results{"resource.$part.$id.numfoils"}=
                    239: 		scalar(@whichopt);
1.1       albertel  240: 	}
1.22      albertel  241:       }
1.1       albertel  242:     }
1.92      sakharuk  243:     &Apache::lonxml::increment_counter(&getfoilcounts($max));
1.25      albertel  244:   } elsif ($target eq 'edit') {
1.22      albertel  245:     $result.=&Apache::edit::end_table();
1.74      albertel  246:   }
                    247:   if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {
                    248:       $result .= '\end{enumerate}';
                    249:   }
1.22      albertel  250:   return $result;
1.1       albertel  251: }
                    252: 
                    253: sub getfoilcounts {
1.48      albertel  254:   my ($max)=@_;
1.22      albertel  255:   # +1 since instructors will count from 1
                    256:   my $count = $#{ $Apache::response::foilgroup{'names'} }+1;
1.39      albertel  257:   if (&Apache::response::showallfoils()) { $max=$count; }
1.48      albertel  258:   if ($count>$max) { $count=$max } 
                    259:   &Apache::lonxml::debug("Count is $count from $max");
                    260:   return $count;
1.1       albertel  261: }
                    262: 
                    263: sub whichfoils {
1.77      albertel  264:     my ($max,$randomize)=@_;
                    265:     return &Apache::response::whichorder($max,$randomize,
                    266: 					 &Apache::response::showallfoils(),
                    267: 					 \%Apache::response::foilgroup);
1.1       albertel  268: }
                    269: 
1.25      albertel  270: sub displayanswers {
1.48      albertel  271:   my ($max,$randomize,@opt)=@_;
1.67      albertel  272:   if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;}
1.25      albertel  273:   my @names = @{ $Apache::response::foilgroup{'names'} };
1.48      albertel  274:   my @whichopt = &whichfoils($max,$randomize);
1.25      albertel  275:   my $result=&Apache::response::answer_header('optionresponse');
                    276:   foreach my $name (@whichopt) {
                    277:     $result.=&Apache::response::answer_part('optionresponse',
                    278: 		     $Apache::response::foilgroup{$name.'.value'})
                    279:   }
                    280:   $result.=&Apache::response::answer_footer('optionresponse');
                    281:   return $result;
                    282: }
                    283: 
1.1       albertel  284: sub displayfoils {
1.48      albertel  285:   my ($target,$max,$randomize,@opt)=@_;
1.67      albertel  286:   if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;}
1.22      albertel  287:   my @names = @{ $Apache::response::foilgroup{'names'} };
                    288:   my @truelist;
                    289:   my @falselist;
1.79      sakharuk  290:   my $result;  
1.22      albertel  291:   my $name;
1.101     albertel  292:   my $displayoptionintex=1;
1.72      sakharuk  293:   my @alphabet = ('A'..'Z');
1.48      albertel  294:   my @whichopt = &whichfoils($max,$randomize);
1.28      albertel  295:   my $part=$Apache::inputtags::part;
                    296:   my $id=$Apache::inputtags::response[-1];
1.62      albertel  297:   my $break;
1.65      albertel  298:   my $solved=$Apache::lonhomework::history{"resource.$part.solved"};
1.86      albertel  299:   if ( ($target ne 'tex') &&
                    300:        &Apache::response::show_answer() ) {
1.90      albertel  301:     my $temp=1;
1.22      albertel  302:     foreach $name (@whichopt) {
1.62      albertel  303: 	my $text=$Apache::response::foilgroup{$name.'.text'};
1.90      albertel  304: 	my %lastresponse=&Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"});
                    305: 	my $lastopt=$lastresponse{$name};
1.101     albertel  306: 	if ($text!~/^\s*$/) { $break='<br />'; }
1.62      albertel  307: 	$result.=$break;
                    308: 	if ($target eq 'web') {
                    309: 	    my $value=$Apache::response::foilgroup{$name.'.value'};
                    310: 	    if (!($text=~s|<drawoptionlist\s*/>|$value|)) {
                    311: 		if ($text=~/^\s*$/) {
                    312: 		    $text=$value.$text;
                    313: 		} else {
                    314: 		    $text=$value.': '.$text;
                    315: 		}
1.95      albertel  316: 	    } else {
                    317: 		$text='&#149;'.$text;
1.62      albertel  318: 	    }
                    319: 	    $result.=$text."\n";
1.32      sakharuk  320:       }
1.58      sakharuk  321:       if ($Apache::lonhomework::type eq 'exam') {
1.90      albertel  322: 	  $result.=&webbubbles(\@opt,\@alphabet,$temp,$lastopt);
1.58      sakharuk  323:       }
1.90      albertel  324:       $temp++;
1.22      albertel  325:     }
                    326:   } else {
                    327:     my $temp=1;
1.28      albertel  328:     my %lastresponse=&Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"});
1.79      sakharuk  329:     my $internal_counter=$Apache::lonxml::counter;
1.22      albertel  330:     foreach $name (@whichopt) {
1.62      albertel  331:       my $text=$Apache::response::foilgroup{$name.'.text'};
                    332:       if ($text!~/^\s*$/) {
                    333: 	  if ($target eq 'tex') {
                    334: 	      $break='\vskip 0 mm ';
                    335: 	  } elsif ($target eq 'web') {
                    336: 	      $break='<br />';
                    337: 	  }
                    338:       }
1.28      albertel  339:       my $lastopt=$lastresponse{$name};
                    340:       my $optionlist="<option></option>\n";
                    341:       my $option;
                    342:       foreach $option (@opt) {
                    343: 	if ($option eq $lastopt) {
                    344: 	  $optionlist.="<option selected=\"on\">$option</option>\n";
                    345: 	} else {
                    346: 	  $optionlist.="<option>$option</option>\n";
                    347: 	}
                    348:       }
1.32      sakharuk  349:       if ($target ne 'tex') {
1.72      sakharuk  350: 	  if ($Apache::lonhomework::type ne 'exam') {
1.101     albertel  351: 	      $optionlist='<select name="HWVAL_'.
                    352: 		  $Apache::inputtags::response['-1'].':'.$temp.'">'.
1.59      albertel  353: 		  $optionlist."</select>\n";
1.101     albertel  354: 	  } else {
                    355: 	      $optionlist='<u>'.('&nbsp;'x10).'</u>';
1.72      sakharuk  356: 	  }
1.101     albertel  357: 	  if ($text=~s|<drawoptionlist\s*/>|$optionlist|) {
                    358: 	      if ($Apache::lonhomework::type ne 'exam') {
                    359: 		  $text='&#149;'.$text;
                    360: 	      }
1.95      albertel  361: 	  } else {
1.101     albertel  362: 	      if ($Apache::lonhomework::type ne 'exam') {
                    363: 		  $text=$optionlist.$text;
                    364: 	      }
1.59      albertel  365: 	  }
1.62      albertel  366: 	  $result.=$break.$text."\n";
1.49      sakharuk  367: 	  if ($Apache::lonhomework::type eq 'exam') {
1.101     albertel  368: 	      $result.=&webbubbles(\@opt,\@alphabet,$temp,$lastopt);
1.49      sakharuk  369: 	  }
1.32      sakharuk  370: 	  $temp++;
                    371:       } else {
1.101     albertel  372: 	  my $texoptionlist='';
                    373: 	  if ($displayoptionintex &&
                    374: 	      $Apache::lonhomework::type ne 'exam') {
                    375: 	      $texoptionlist = &optionlist_correction(@opt);
                    376: 	  }
                    377: 	  if ($text=~/<drawoptionlist\s*\/>/) {
                    378: 	      $text=~s|<drawoptionlist\s*/>| \\makebox\[0\.3in\]\[b\]\{\\hrulefill\} |;
                    379: 	  }
                    380: 
                    381: 	  if ($text=~m/\\item /) {
1.50      sakharuk  382: 	      if ($Apache::lonhomework::type eq 'exam') {
1.101     albertel  383: 	          $text=~s/\\item/\\vskip 2 mm/;
1.50      sakharuk  384: 	      }
1.101     albertel  385: 	      $result.= $texoptionlist.$text;
1.32      sakharuk  386: 	  } else {
1.101     albertel  387: 	      if ($Apache::lonhomework::type eq 'exam') {
                    388: 		  $result.= $texoptionlist.'  '.$text;
1.46      sakharuk  389: 	      } else {
1.101     albertel  390: 		  $result.= $texoptionlist.'\vspace*{-2 mm}\item '.$text;
1.50      sakharuk  391: 	      }
1.32      sakharuk  392: 	  }
1.101     albertel  393: 	  if ($Apache::lonhomework::type eq 'exam') {
                    394: 	      $result.='\vskip -1 mm\noindent\begin{enumerate}\item[\textbf{'.
                    395: 		  $internal_counter.'}.]'.&bubbles(\@alphabet,\@opt).
                    396: 		  '\end{enumerate} \vskip -8 mm \strut ';
                    397: 	      $internal_counter++;
                    398: 	  }
                    399: 	  $displayoptionintex=0;
1.62      albertel  400:       }
1.1       albertel  401:     }
1.62      albertel  402:   }
1.32      sakharuk  403:   if ($target ne 'tex') {
1.62      albertel  404:       return $result.$break;
                    405:   } else {
1.32      sakharuk  406:       return $result;
1.22      albertel  407:   }
1.50      sakharuk  408: }
                    409: 
                    410: 
                    411: sub optionlist_correction {
1.101     albertel  412:     my @options = @_;
                    413:     my $texoptionlist='\\item [] Choices: ';
                    414:     if (scalar(@options) > 0) {
                    415: 	foreach my $option (@options) {
                    416: 	    $texoptionlist.='{\bf '.
                    417: 		&Apache::lonxml::latex_special_symbols($option).
                    418: 		'},';
                    419: 	}
                    420: 	chop($texoptionlist);
                    421: 	$texoptionlist.='.';
1.80      sakharuk  422:     } else {
1.101     albertel  423: 	$texoptionlist='\\item [] \\vskip -5 mm';
1.80      sakharuk  424:     }
1.50      sakharuk  425:     return $texoptionlist;
1.58      sakharuk  426: }
                    427: 
                    428: 
                    429: sub webbubbles {
1.90      albertel  430:     my ($ropt,$ralphabet,$temp,$lastopt)=@_;
1.58      sakharuk  431:     my @opt=@$ropt; 
                    432:     my @alphabet=@$ralphabet;
                    433:     my $result='';
1.90      albertel  434:     my $number_of_bubbles = $#opt + 1;
                    435:     $result.= '<table border="1"><tr>';
                    436:     for (my $ind=0;$ind<$number_of_bubbles;$ind++) {
                    437: 	my $checked='';
                    438: 	if ($lastopt eq $opt[$ind]) {
                    439: 	    $checked=' checked="on" ';
1.58      sakharuk  440: 	}
1.90      albertel  441: 	$result.='<td><input type="radio" name="HWVAL_'.
                    442: 	    $Apache::inputtags::response['-1'].':'.$temp.
                    443: 	    '" value="'.$opt[$ind].'" '.$checked.' />'.$alphabet[$ind].': '.
                    444: 	    $opt[$ind].'</td>';
                    445:     }
                    446:     $result.='</tr></table>';
                    447:     return $result;
1.50      sakharuk  448: }
                    449: 
                    450: 
                    451: sub bubbles {
                    452:     my ($ralphabit,$ropt) = @_;
                    453:     my @alphabet = @$ralphabit;
                    454:     my @opt = @$ropt;
1.51      sakharuk  455:     my ($result,$head,$line) =('','','');
1.50      sakharuk  456:     my $number_of_bubbles = $#opt + 1;
1.51      sakharuk  457:     my $current_length = 0;
1.100     sakharuk  458:     my $textwidth;
                    459:     if ($ENV{'form.textwidth'} ne '') {
                    460: 	$ENV{'form.textwidth'}=~/(\d+)/;
                    461: 	$textwidth=$1;
                    462:     } else {
1.102   ! sakharuk  463: 	$ENV{'textwidth'}=~/(\d*)\.?(\d*)/;
        !           464: 	$textwidth=$1.'.'.$2;
1.100     sakharuk  465:     }
1.51      sakharuk  466:     for (my $ind=0;$ind<=$number_of_bubbles;$ind++) {
1.99      sakharuk  467: 	my $leftmargin;
1.101     albertel  468: 	$opt[$ind]=&Apache::lonxml::latex_special_symbols($opt[$ind]);
1.99      sakharuk  469: 	if ($ind==0) {$leftmargin=6;} else {$leftmargin=10;}
1.102   ! sakharuk  470: 	$current_length += (length($opt[$ind])+length($alphabet[$ind])+4)*2;
1.99      sakharuk  471: 	if ($current_length<($textwidth-$leftmargin) and $ind!=$number_of_bubbles) {
1.51      sakharuk  472: 	    $line.='\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';
                    473: 	    $head.='lr';
                    474: 	} else {
                    475: 	    $line=~s/\&\s*$//;
1.99      sakharuk  476: 	    $result.='\vskip -2 mm\noindent\begin{tabular}{'.$head.'}'.$line.'\\\\\end{tabular}';
1.51      sakharuk  477: 	    $line = '\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';;
                    478: 	    $head ='lr';
                    479: 	    $current_length = (length($opt[$ind])+length($alphabet[$ind]))*2;
                    480: 	}
                    481: 
1.50      sakharuk  482:     }
                    483:     return $result;
1.1       albertel  484: }
                    485: 
1.22      albertel  486: 
1.2       albertel  487: sub start_conceptgroup {
1.22      albertel  488:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    489:   $Apache::optionresponse::conceptgroup=1;
1.44      albertel  490:   %Apache::response::conceptgroup=();
1.22      albertel  491:   my $result;
                    492:   if ($target eq 'edit') {
                    493:     $result.=&Apache::edit::tag_start($target,$token,"Concept Grouped Foils");
1.30      matthew   494:     $result.=&Apache::edit::text_arg('Concept:','concept',$token,'50').
                    495:         &Apache::edit::end_row().&Apache::edit::start_spanning_row();
1.22      albertel  496:   }
                    497:   if ($target eq 'modified') {
                    498:     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,'concept');
                    499:     if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                    500:   }
                    501:   return $result;
1.2       albertel  502: }
                    503: 
                    504: sub end_conceptgroup {
1.22      albertel  505:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    506:   $Apache::optionresponse::conceptgroup=0;
                    507:   my $result='';
1.93      albertel  508:   if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                    509:       $target eq 'tex' || $target eq 'analyze') {
1.22      albertel  510:     #if not there aren't any foils to display and thus no question
1.93      albertel  511:       &Apache::response::pick_foil_for_concept($target,
                    512: 					       ['value','text','location'],
                    513: 					       \%Apache::hint::option,
                    514: 					       $parstack,$safeeval);
1.34      albertel  515:   } elsif ($target eq 'edit') {
1.22      albertel  516:     $result=&Apache::edit::end_table();
                    517:   }
                    518:   return $result;
1.2       albertel  519: }
                    520: 
1.16      albertel  521: sub insert_conceptgroup {
1.22      albertel  522:   my $result="\n\t\t<conceptgroup concept=\"\">".&insert_foil()."\n\t\t</conceptgroup>\n";
                    523:   return $result;
1.16      albertel  524: }
                    525: 
1.1       albertel  526: sub start_foil {
1.22      albertel  527:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    528:   my $result='';
1.34      albertel  529:   if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze' ) {
1.25      albertel  530:     &Apache::lonxml::startredirection;
                    531:   } elsif ($target eq 'edit') {
1.22      albertel  532:     $result=&Apache::edit::tag_start($target,$token,"Foil");
                    533:     my $level='-2';
                    534:     if ($$tagstack['-2'] eq 'conceptgroup') { $level = '-3'; }
                    535:     my @opt;
                    536:     eval '@opt ='.&Apache::lonxml::get_param('options',$parstack,$safeeval,$level);
                    537:     $result.=&Apache::edit::text_arg('Name:','name',$token);
1.48      albertel  538:     $result.= &Apache::edit::select_or_text_arg('Correct Option:','value',
                    539: 					       ['unused',(@opt)],$token,'15');
                    540:     my $randomize=&Apache::lonxml::get_param('randomize',$parstack,
                    541: 					     $safeeval,'-3');
                    542:     if ($randomize ne 'no') {
                    543: 	$result.=&Apache::edit::select_arg('Location:','location',
                    544: 					   ['random','top','bottom'],$token);
                    545:     }
1.30      matthew   546:     $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1.25      albertel  547:   } elsif ($target eq 'modified') {
1.48      albertel  548:     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,
                    549: 						 'value','name','location');
1.22      albertel  550:     if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.32      sakharuk  551:   } 
1.22      albertel  552:   return $result;
1.1       albertel  553: }
                    554: 
                    555: sub end_foil {
1.22      albertel  556:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    557:   my $text ='';
                    558:   my $result = '';
1.88      albertel  559:   if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { 
1.48      albertel  560:       $text=&Apache::lonxml::endredirection;
1.68      sakharuk  561:       if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') { $text = '\vspace*{-2 mm}\item '.$text; }
1.32      sakharuk  562:   }
                    563:   if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' 
1.34      albertel  564:       || $target eq 'tex' || $target eq 'analyze') {
1.22      albertel  565:     my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval);
                    566:     if ($value ne 'unused') {
                    567:       my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
1.48      albertel  568:       my $location =&Apache::lonxml::get_param('location',$parstack,$safeeval);
1.22      albertel  569:       &Apache::lonxml::debug("Got a name of :$name:");
                    570:       if (!$name) { $name=$Apache::lonxml::curdepth; }
                    571:       &Apache::lonxml::debug("Using a name of :$name:");
1.39      albertel  572:       if ( $Apache::optionresponse::conceptgroup
                    573: 	   && !&Apache::response::showallfoils() ) {
1.22      albertel  574: 	push @{ $Apache::response::conceptgroup{'names'} }, $name;
                    575: 	$Apache::response::conceptgroup{"$name.value"} = $value;
1.70      albertel  576: 	if ($target eq 'tex' and $Apache::lonhomework::type eq 'exam') {
1.69      sakharuk  577: 	    $Apache::response::conceptgroup{"$name.text"} = '\vskip 4 mm $\triangleright$ '.$text;
                    578: 	} else {
1.87      sakharuk  579: 	    $Apache::response::conceptgroup{"$name.text"} = $text;
1.69      sakharuk  580: 	}
1.48      albertel  581: 	$Apache::response::conceptgroup{"$name.location"} = $location;
1.22      albertel  582:       } else {
                    583: 	push @{ $Apache::response::foilgroup{'names'} }, $name;
1.48      albertel  584: 	$Apache::response::foilgroup{"$name.value"} = $value;
1.78      sakharuk  585: 	if ($target eq 'tex' and $Apache::lonhomework::type eq 'exam') {
1.69      sakharuk  586: 	    $Apache::response::foilgroup{"$name.text"} = '\vskip 5 mm $\triangleright$ '.$text;
                    587: 	} else {
1.87      sakharuk  588: 	    $Apache::response::foilgroup{"$name.text"} = $text;
1.69      sakharuk  589: 	}
1.48      albertel  590: 	$Apache::response::foilgroup{"$name.location"} = $location;
1.22      albertel  591:       }
                    592:     }
                    593:   }
                    594:   if ($target eq 'edit') {
                    595:     $result.= &Apache::edit::tag_end($target,$token,'');
                    596:   }
                    597:   return $result;
1.1       albertel  598: }
                    599: 
1.7       albertel  600: sub insert_foil {
1.22      albertel  601:   return '
1.15      albertel  602: <foil name="" value="unused">
1.14      albertel  603: <startouttext />
                    604: <endouttext />
1.7       albertel  605: </foil>';
                    606: }
1.1       albertel  607: 1;
                    608: __END__
                    609:  

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.