[LON-CAPA-cvs] cvs: loncom /homework optionresponse.pm
foxr
lon-capa-cvs@mail.lon-capa.org
Wed, 15 Mar 2006 00:08:53 -0000
foxr Tue Mar 14 19:08:53 2006 EDT
Modified files:
/loncom/homework optionresponse.pm
Log:
Defect 3340 - Allow <display></display> to operate
within the options of a <foilgroup> tag...to inhibit
latex fixups. I need to test some edge cases still, but
the 'main' case appears to work fine now.
Index: loncom/homework/optionresponse.pm
diff -u loncom/homework/optionresponse.pm:1.133 loncom/homework/optionresponse.pm:1.134
--- loncom/homework/optionresponse.pm:1.133 Wed Mar 8 20:04:43 2006
+++ loncom/homework/optionresponse.pm Tue Mar 14 19:08:53 2006
@@ -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 @@
}
+# Correct a single option list element.
+# - For embedded <display></display> 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 <display></display>
+ my $result =""; # The return string is built here.
+
+ while ($here < $strlen) {
+ # look for an opening <display> tag:
+
+ my $openloc = index($option, "<display>", $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 <display> tag
+ # through l_s_s ...
+ $result .= &Apache::lonxml::latex_special_symbols(substr($option, $here, $openloc-$here));
+ }
+ # look for the closing </display> tag...
+ # We're a bit stupid..or tolerant...
+ # in that if the user forgets the </display> tag
+ # we infer they intended one at the end of the option.
+ $openloc += 9; # 9 chars in <display>
+
+ my $closeloc = index($option, "</display>", $openloc); # 9 chars in <display>
+ if ($closeloc == -1) {
+ $closeloc = $strlen + 9; # 10chars in </display> 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 </display>
+ }
+
+ 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 @@
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 ',