--- loncom/xml/lonxml.pm	2003/11/21 20:21:20	1.295
+++ loncom/xml/lonxml.pm	2004/02/26 23:39:03	1.303
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.295 2003/11/21 20:21:20 albertel Exp $
+# $Id: lonxml.pm,v 1.303 2004/02/26 23:39:03 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -192,7 +192,7 @@ sub xmlend {
 	$mode='problem';
 	$status=$Apache::inputtags::status[-1]; 
     }
-    return &Apache::lonfeedback::list_discussion().'</html>';
+    return &Apache::lonfeedback::list_discussion($mode,$status).'</html>';
 }
 
 sub tokeninputfield {
@@ -405,12 +405,13 @@ sub latex_special_symbols {
 	$string =~ s/_/ /g;
     } else {
 	$string=~s/\\ /\\char92 /g;
-	$string=~s/\^/\\\^ /g;
+	$string=~s/\^/\\\^\\strut /g;
 	$string=~s/\~/\\char126 /g;
 	#fixup & if it doesn't look like
         # &#123; or &alpha;
 	$string=~s/(&(?!((\#[0-9]+)|([a-z]+));))/\\$1/gi;
-	$string=~s/([^&])\#/$1\\#/g;
+        $string=~s/([^&\\])\#/$1\\#/g;
+	$string=~s/\#\#/\#\\#/g;
 	$string=~s/(\$|_|{|})/\\$1/g;
 	$string=~s/\\char92 /\\texttt{\\char92}/g;
 	$string=~s/(>|<)/\$$1\$/g; #more or less
@@ -759,6 +760,28 @@ sub init_safespace {
   $safeinit .= ';$external::randomseed='.$rndseed.';';
   &Apache::lonxml::debug("Setting rndseed to $rndseed");
   &Apache::run::run($safeinit,$safeeval);
+
+  my $subroutine=<<'EVALUATESUB';
+sub __LC_INTERNAL_EVALUATE__ {
+    my ($__LC__a,$__LC__b,$__LC__c)=@_;
+    my $__LC__prefix;
+    my $__LC__msg;
+    while(1){
+	{ 
+	    use strict;
+	    if (eval(defined(eval($__LC__a.$__LC__b)))) {
+		return $__LC__msg.$__LC__prefix.eval($__LC__a.$__LC__b.$__LC__c);
+	    }
+	}
+	$__LC__prefix.=substr($__LC__a,0,1,"");
+	if ($__LC__a!~/^(\$|&|\#)/) { last; }
+    }
+    return $__LC__prefix.$__LC__a.$__LC__b.$__LC__c.$__LC__msg;
+}
+EVALUATESUB
+    $safeeval->permit("require");
+    $safeeval->reval($subroutine);
+    $safeeval->deny("require");
 }
 
 sub default_homework_load {
@@ -998,7 +1021,6 @@ sub parstring {
       my $val=$token->[2]->{$_};
       $val =~ s/([\%\@\\\"\'])/\\$1/g;
       #if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
-      if ($val !~ m/^\s*\$[a-z_]/i) { $val =~ s/\$/\\\$/g; }
       $temp .= "my \$$_=\"$val\";";
     }
   }
@@ -1295,21 +1317,25 @@ sub display_title {
 }
 
 sub debug {
-  if ($Apache::lonxml::debug eq 1) {
-    $|=1;
-    print('<font size="-2"<pre>DEBUG:'.&HTML::Entities::encode($_[0])."</pre></font>\n");
-  }
+    if ($Apache::lonxml::debug eq "1") {
+	$|=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");
+    }
 }
 
 sub error {
   $errorcount++;
+  my $request=$Apache::lonxml::request;
+  if (!$request) { $request=Apache->request; }
   if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) {
     # If printing in construction space, put the error inside <pre></pre>
-      print $Apache::lonxml::warnings_error_header.
-	  "<b>ERROR:</b>".join("\n",@_)."\n";
+      $request->print($Apache::lonxml::warnings_error_header.
+		      "<b>ERROR:</b>".join("\n",@_)."\n");
       $Apache::lonxml::warnings_error_header='';
   } else {
-    print "<b>An Error occured while processing this resource. The instructor has been notified.</b> <br />";
+    $request->print("<b>An Error occured while processing this resource. The instructor has been notified.</b> <br />");
     #notify author
     &Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('<br />',@_));
     #notify course
@@ -1322,10 +1348,6 @@ sub error {
         "Error [$declutter]",join('<br />',@_));
       }
     }
-
-    #FIXME probably shouldn't have me get everything forever.
-    &Apache::lonmsg::user_normal_msg('albertel','msu',"Error in $ENV{'request.filename'}",join('<br />',@_));
-    #&Apache::lonmsg::user_normal_msg('albertel','103',"Error in $ENV{'request.filename'}",$_[0]);
   }
 }
 
@@ -1334,8 +1356,10 @@ sub warning {
   
     if ($ENV{'form.grade_target'} ne 'tex') {
 	if ($ENV{'request.state'} eq 'construct' || $Apache::lonxml::debug) {
-	    print $Apache::lonxml::warnings_error_header.
-		"<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n";
+	    my $request=$Apache::lonxml::request;
+	    if (!$request) { $request=Apache->request; }
+	    $request->print($Apache::lonxml::warnings_error_header.
+		      "<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n");
 	    $Apache::lonxml::warnings_error_header='';
 	}
     }
@@ -1346,6 +1370,9 @@ sub get_param {
     if ( ! $context ) { $context = -1; }
     my $args ='';
     if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }
+    if ( ! $Apache::lonxml::usestyle ) {
+	$args=$Apache::lonxml::style_values.$args;
+    }
     if ( ! $args ) { return undef; }
     if ( $case_insensitive ) {
 	if ($args =~ s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei) {
@@ -1369,6 +1396,9 @@ sub get_param_var {
   if ( ! $context ) { $context = -1; }
   my $args ='';
   if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }
+  if ( ! $Apache::lonxml::usestyle ) {
+      $args=$Apache::lonxml::style_values.$args;
+  }
   &Apache::lonxml::debug("Args are $args param is $param");
   if ($case_insensitive) {
       if (! ($args=~s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei)) {