--- loncom/xml/lonxml.pm	2006/05/15 22:30:10	1.412
+++ loncom/xml/lonxml.pm	2006/09/29 20:36:45	1.420
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.412 2006/05/15 22:30:10 albertel Exp $
+# $Id: lonxml.pm,v 1.420 2006/09/29 20:36:45 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -366,13 +366,14 @@ sub latex_special_symbols {
 	return $string;
     }
     if ($where eq 'header') {
-	$string =~ s/(\\|_|\^)/ /g;
+	$string =~ s/\\/\$\\backslash\$/g; # \  -> $\backslash$ per LaTex line by line pg  10.
 	$string =~ s/(\$|%|\{|\})/\\$1/g;
-	$string =~ s/_/ /g;
 	$string=&Apache::lonprintout::character_chart($string);
 	# any & or # leftover should be safe to just escape
         $string=~s/([^\\])\&/$1\\\&/g;
         $string=~s/([^\\])\#/$1\\\#/g;
+	$string =~ s/_/\\_/g;              # _ -> \_
+	$string =~ s/\^/\\\^{}/g;          # ^ -> \^{} 
     } else {
 	$string=~s/\\/\\ensuremath{\\backslash}/g;
 	$string=~s/\\\%|\%/\\\%/g;
@@ -771,8 +772,11 @@ sub init_safespace {
   $safehole->wrap(\&Math::Random::random_set_seed,$safeeval,'&random_set_seed');
   $safehole->wrap(\&Apache::lonxml::error,$safeeval,'&LONCAPA_INTERNAL_ERROR');
   $safehole->wrap(\&Apache::lonxml::debug,$safeeval,'&LONCAPA_INTERNAL_DEBUG');
+  $safehole->wrap(\&Apache::lonnet::logthis,$safeeval,'&LONCAPA_INTERNAL_LOGTHIS');
+  $safehole->wrap(\&Apache::inputtags::finalizeawards,$safeeval,'&LONCAPA_INTERNAL_FINALIZEAWARDS');
   $safehole->wrap(\&Apache::caparesponse::get_sigrange,$safeeval,'&LONCAPA_INTERNAL_get_sigrange');
-
+  use Data::Dumper;
+  $safehole->wrap(\&Data::Dumper::Dumper,$safeeval,'&Dumper');
 #need to inspect this class of ops
 # $safeeval->deny(":base_orig");
   $safeeval->permit("require");
@@ -1148,19 +1152,23 @@ sub newparser {
 }
 
 sub parstring {
-  my ($token) = @_;
-  my $temp='';
-  foreach (@{$token->[3]}) {
-    unless ($_=~/\W/) {
-      my $val=$token->[2]->{$_};
-      $val =~ s/([\%\@\\\"\'])/\\$1/g;
-      $val =~ s/(\$[^{a-zA-Z_])/\\$1/g;
-      $val =~ s/(\$)$/\\$1/;
-      #if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
-      $temp .= "my \$$_=\"$val\";";
-    }
-  }
-  return $temp;
+    my ($token) = @_;
+    my (@vars,@values);
+    foreach my $attr (@{$token->[3]}) {
+	if ($attr!~/\W/) {
+	    my $val=$token->[2]->{$attr};
+	    $val =~ s/([\%\@\\\"\'])/\\$1/g;
+	    $val =~ s/(\$[^\{a-zA-Z_])/\\$1/g;
+	    $val =~ s/(\$)$/\\$1/;
+	    #if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
+	    push(@vars,"\$$attr");
+	    push(@values,"\"$val\"");
+	}
+    }
+    my $var_init = 
+	(@vars) ? 'my ('.join(',',@vars).') = ('.join(',',@values).');'
+	        : '';
+    return $var_init;
 }
 
 sub extlink {
@@ -1539,7 +1547,8 @@ sub error {
 	    #public or browsers
 	    $errormsg=&mt("An error occured while processing this resource. The author has been notified.");
 	}
-	my $msg = join('<br />',@_);
+	my $host=$Apache::lonnet::perlvar{'lonHostID'};
+	my $msg = join('<br />',(@_,"The error occurred on host <tt>$host</tt>"));
 	#notify author
 	&Apache::lonmsg::author_res_msg($env{'request.filename'},$msg);
 	#notify course
@@ -1622,14 +1631,14 @@ sub get_param {
     }
     if ( ! $args ) { return undef; }
     if ( $case_insensitive ) {
-	if ($args =~ s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei) {
+	if ($args =~ s/(my (?:.*))(\$\Q$param\E[,\)])/$1.lc($2)/ei) {
 	    return &Apache::run::run("{$args;".'return $'.$param.'}',
                                      $safeeval); #'
 	} else {
 	    return undef;
 	}
     } else {
-	if ( $args =~ /my \$\Q$param\E=\"/ ) {
+	if ( $args =~ /my .*\$\Q$param\E[,\)]/ ) {
 	    return &Apache::run::run("{$args;".'return $'.$param.'}',
                                      $safeeval); #'
 	} else {
@@ -1648,10 +1657,10 @@ sub get_param_var {
   }
   &Apache::lonxml::debug("Args are $args param is $param");
   if ($case_insensitive) {
-      if (! ($args=~s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei)) {
+      if (! ($args=~s/(my (?:.*))(\$\Q$param\E[,\)])/$1.lc($2)/ei)) {
 	  return undef;
       }
-  } elsif ( $args !~ /my \$\Q$param\E=\"/ ) { return undef; }
+  } elsif ( $args !~ /my .*\$\Q$param\E[,\)]/ ) { return undef; }
   my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
   &Apache::lonxml::debug("first run is $value");
   if ($value =~ /^[\$\@\%][a-zA-Z_]\w*$/) {