--- 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 = "';
+ $result.=')" ';
+ $result .= 'texoptions="'.$token->[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:");