--- loncom/homework/optionresponse.pm 2006/03/09 01:04:43 1.133 +++ 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.133 2006/03/09 01:04:43 albertel Exp $ +# $Id: optionresponse.pm,v 1.134 2006/03/15 00:08:53 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -481,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: '; @@ -488,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 ',