--- loncom/xml/lonxml.pm	2004/03/12 17:26:29	1.310
+++ loncom/xml/lonxml.pm	2004/03/30 07:16:24	1.314
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.310 2004/03/12 17:26:29 sakharuk Exp $
+# $Id: lonxml.pm,v 1.314 2004/03/30 07:16:24 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -401,17 +401,24 @@ sub latex_special_symbols {
     my ($string,$where)=@_;
     if ($where eq 'header') {
 	$string =~ s/(\\|_|\^)/ /g;
-	$string =~ s/(\$|%|\#|&|\{|\})/\\$1/g;
+	$string =~ s/(\$|%|\{|\})/\\$1/g;
 	$string =~ s/_/ /g;
-    } else {
-	$string=~s/([^\\])\%/$1\\\%/g;
-	$string=~s/([^\\])(\$|_)/$1\\$2/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;
+    } else {
+	$string=~s/\\/\\ensuremath{\\backslash}/g;
+	$string=~s/([^\\]|^)\%/$1\\\%/g;
+	$string=~s/([^\\]|^)(\$|_)/$1\\$2/g;
+	$string=~s/\$\$/\$\\\$/g;
 	$string=~s/\#\#/\#\\\#/g;
-        $string=~s/([^\\])(\~|\^)/$1\\$2\\strut /g;
+        $string=~s/([^\\]|^)(\~|\^)/$1\\$2\\strut /g;
 	$string=~s/(>|<)/\\ensuremath\{$1\}/g; #more or less
+	$string=&Apache::lonprintout::character_chart($string);
+	# any & or # leftover should be safe to just escape
+        $string=~s/([^\\]|^)\&/$1\\\&/g;
+        $string=~s/([^\\]|^)\#/$1\\\#/g;
 #single { or } How to escape?
     }
     return $string;
@@ -506,7 +513,7 @@ sub inner_xmlparse {
       if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
 	  #Style file definitions should be correct
 	  if ($target eq 'tex' && ($Apache::lonxml::usestyle)) {
-	      $result=&latex_special_symbols(&Apache::lonprintout::character_chart($result));
+	      $result=&latex_special_symbols($result);
 	  }
       }
 
@@ -746,6 +753,7 @@ sub init_safespace {
   $safehole->wrap(\&Math::Random::random_get_seed,$safeeval,'&random_get_seed');
   $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');
 
 #need to inspect this class of ops
 # $safeeval->deny(":base_orig");
@@ -959,7 +967,7 @@ sub get_all_text {
 	    #never found the end tag ran out of text, throw error send back blank
 	    &error('Never found end tag for &lt;'.$tag.
 		   '&gt; current string <pre>'.
-		   &HTML::Entities::encode($result).
+		   &HTML::Entities::encode($result,'<>&"').
 		   '</pre>');
 	    if ($gotfullstack) {
 		my $newstring='</'.$tag.'>'.$result;
@@ -1136,7 +1144,7 @@ SIMPLECONTENT
 
 sub inserteditinfo {
       my ($result,$filecontents,$filetype)=@_;
-      $filecontents = &HTML::Entities::encode($filecontents);
+      $filecontents = &HTML::Entities::encode($filecontents,'<>&"');
 #      my $editheader='<a href="#editsection">Edit below</a><hr />';
       my $xml_help = '';
       if ($filetype eq 'html') {
@@ -1321,7 +1329,7 @@ sub debug {
 	$|=1;
 	my $request=$Apache::lonxml::request;
 	if (!$request) { $request=Apache->request; }
-	$request->print('<font size="-2"><pre>DEBUG:'.&HTML::Entities::encode($_[0])."</pre></font>\n");
+	$request->print('<font size="-2"><pre>DEBUG:'.&HTML::Entities::encode($_[0],'<>&"')."</pre></font>\n");
     }
 }