--- loncom/homework/optionresponse.pm 2005/06/07 01:33:19 1.126 +++ loncom/homework/optionresponse.pm 2006/03/15 00:08:53 1.134 @@ -1,7 +1,7 @@ # LearningOnline Network with CAPA # option list style responses # -# $Id: optionresponse.pm,v 1.126 2005/06/07 01:33:19 albertel Exp $ +# $Id: optionresponse.pm,v 1.134 2006/03/15 00:08:53 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -114,6 +114,9 @@ sub start_foilgroup { Delete an Option: ENDTABLE + $result.= &Apache::edit::checked_arg('Print options:','texoptions', + [ ['nochoice','Don\'t show option list'] ] + ,$token); $result.= &Apache::edit::end_row(); $result.= &Apache::edit::start_spanning_row(); $result.= $insertlist.'
'; @@ -137,7 +140,9 @@ ENDTABLE } $optchanged=1; } - if ($optchanged) { + my $rebuildtag = &Apache::edit::get_new_args($token,$parstack,$safeeval, + ('texoptions')); + if ($optchanged || $rebuildtag ) { $result = "[2]{'texoptions'}.'" '; + $result .= '>'; } # else nothing changed so just use the default mechanism } if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') { @@ -295,17 +302,34 @@ sub whichfoils { } sub displayanswers { - my ($max,$randomize,@opt)=@_; - if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;} - my @names = @{ $Apache::response::foilgroup{'names'} }; - my @whichopt = &whichfoils($max,$randomize); - my $result=&Apache::response::answer_header('optionresponse'); - foreach my $name (@whichopt) { - $result.=&Apache::response::answer_part('optionresponse', - $Apache::response::foilgroup{$name.'.value'}) - } - $result.=&Apache::response::answer_footer('optionresponse'); - return $result; + my ($max,$randomize,@opt)=@_; + if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;} + my @names = @{ $Apache::response::foilgroup{'names'} }; + my @whichopt = &whichfoils($max,$randomize); + my $result; + if ($Apache::lonhomework::type eq 'exam') { + my $i = 0; + my %opt = map { ($_,$i++) } @opt; + + $i = 0; + my @alphabet = ('A'..'Z'); + foreach my $name (@whichopt) { + $result.=&Apache::response::answer_header('optionresponse',$i++); + $result.=&Apache::response::answer_part('optionresponse', + $alphabet[$opt{$Apache::response::foilgroup{$name.'.value'}}]); + $result.=&Apache::response::answer_part('optionresponse', + $Apache::response::foilgroup{$name.'.value'}); + $result.=&Apache::response::answer_footer('optionresponse'); + } + } else { + $result=&Apache::response::answer_header('optionresponse'); + foreach my $name (@whichopt) { + $result.=&Apache::response::answer_part('optionresponse', + $Apache::response::foilgroup{$name.'.value'}); + } + $result.=&Apache::response::answer_footer('optionresponse'); + } + return $result; } sub check_for_invalid { @@ -360,7 +384,7 @@ sub displayfoils { if ($text=~/^\s*$/) { $text=$value.$text; } else { - $text=$value.': '.$text; + $text=''.$value.': '.$text; } } else { $text='•'.$text; @@ -390,7 +414,7 @@ sub displayfoils { foreach my $option (@opt) { my $escopt=&HTML::Entities::encode($option,'\'"&<>'); if ($option eq $lastopt) { - $optionlist.="\n"; + $optionlist.="\n"; } else { $optionlist.="\n"; } @@ -457,6 +481,65 @@ sub displayfoils { } +# Correct a single option list element. +# - For embedded tags, +# we pass literally the stuff between them. +# - For everything else, we run through latex_special_symbols +# so that any symbols that have meaning to LaTeX will be +# correctly escaped. +# +sub correct_option { + my $option = shift; + + + # There's probably a beter way with perl if I was + # more of a regexp wiz..(RF). + + my $strlen = length($option); + my $here = 0; # Where to start searching for + my $result =""; # The return string is built here. + + while ($here < $strlen) { + # look for an opening tag: + + my $openloc = index($option, "", $here); + if ($openloc == -1) { + # No more... operate with latex_special_symbols on + # the rest of the string. + + $result .= &Apache::lonxml::latex_special_symbols(substr($option, $here)); + return $result; + } else { + # Need to pass the string up to the tag + # through l_s_s ... + $result .= &Apache::lonxml::latex_special_symbols(substr($option, $here, $openloc-$here)); + } + # look for the closing tag... + # We're a bit stupid..or tolerant... + # in that if the user forgets the tag + # we infer they intended one at the end of the option. + $openloc += 9; # 9 chars in + + my $closeloc = index($option, "", $openloc); # 9 chars in + if ($closeloc == -1) { + $closeloc = $strlen + 9; # 10chars in faked off end. + } + # Pass from openloc through closeloc without any interpretation: + + &Apache::lonnet::logthis("Segment inside display: $openloc through $closeloc"); + $result .= substr($option, $openloc, $closeloc - $openloc); + $here = $closeloc + 10; # Next search is after the + } + + return $result; + + # return &Apache::lonxml::latex_special_symbols($option); +} + +# Correct the option list elements so that if there +# are special symbosl that have meaning to LaTeX +# they get fixed up to display correctly. + sub optionlist_correction { my ($TeXlayout,@options) = @_; my $texoptionlist='\\item [] Choices: '; @@ -464,7 +547,7 @@ sub optionlist_correction { if (scalar(@options) > 0) { foreach my $option (@options) { $texoptionlist.='{\bf '. - &Apache::lonxml::latex_special_symbols($option). + &correct_option($option). '}'; if ($TeXlayout eq 'vertical') { $texoptionlist.=' \vskip 0 mm ', @@ -532,7 +615,7 @@ sub bubbles { $head.='lr'; } else { $line=~s/\&\s*$//; - $result.='\vskip -2 mm\noindent\begin{tabular}{'.$head.'}'.$line.'\\\\\end{tabular}\vskip 0 mm'; + $result.='\vskip -2 mm\noindent\setlength{\tabcolsep}{2 mm}\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].'} & ';; $head ='lr'; $current_length = (length($opt[$ind])+length($alphabet[$ind]))*2; @@ -632,8 +715,8 @@ sub end_foil { if ($value ne 'unused') { my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval); &Apache::lonxml::debug("Got a name of :$name:"); - if (!$name) { - &Apache::lonxml::error("Foils without names exist. This can cause problems to malfunction."); + if ($name eq "") { + &Apache::lonxml::warning("Foils without names exist. This can cause problems to malfunction."); $name=$Apache::lonxml::curdepth; } &Apache::lonxml::debug("Using a name of :$name:");