--- loncom/xml/lonxml.pm	2003/05/16 20:51:25	1.254
+++ loncom/xml/lonxml.pm	2003/05/29 18:41:04	1.259
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.254 2003/05/16 20:51:25 albertel Exp $
+# $Id: lonxml.pm,v 1.259 2003/05/29 18:41:04 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -421,8 +421,7 @@ sub xmlparse {
        }
     }
  }
-
- #&printalltags();
+#&printalltags();
  my @pars = ();
  my $pwd=$ENV{'request.filename'};
  $pwd =~ s:/[^/]*$::;
@@ -441,6 +440,7 @@ sub xmlparse {
 
  my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars,
 				   $safeeval,\%style_for_target);
+
  if ($ENV{'request.uri'}) {
     &writeallows($ENV{'request.uri'});
  }
@@ -494,6 +494,7 @@ sub inner_xmlparse {
   my $finaloutput = '';
   my $result;
   my $token;
+  my $dontpop=0;
   while ( $#$pars > -1 ) {
     while ($token = $$pars['-1']->get_token) {
       if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
@@ -521,42 +522,50 @@ sub inner_xmlparse {
 	    my $string=$$style_for_target{$token->[1]}.
 	      '<LONCAPA_INTERNAL_TURN_STYLE_ON />';
 	    &Apache::lonxml::newparser($pars,\$string);
+	    $Apache::lonxml::style_values=$$parstack[-1];
+	    $Apache::lonxml::style_end_values=$$parstack[-1];
 	} else {
 	  $result = &callsub("start_$token->[1]", $target, $token, $stack,
 			     $parstack, $pars, $safeeval, $style_for_target);
 	}
       } elsif ($token->[0] eq 'E') {
-	#clear out any tags that didn't end
-	while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
-	  my $lasttag=$$stack[-1];
-	  if ($token->[1] =~ /^$lasttag$/i) {
-	    &Apache::lonxml::warning('Using tag &lt;/'.$token->[1].'&gt; on line '.$token->[3].' as end tag to &lt;'.$$stack[-1].'&gt;');
-	    last;
-	  } else {
-	    &Apache::lonxml::warning('Found tag &lt;/'.$token->[1].'&gt; on line '.$token->[3].' when looking for &lt;/'.$$stack[-1].'&gt; in file');
-	    &end_tag($stack,$parstack,$token);
-	  }
-	}
-
 	if ($Apache::lonxml::usestyle &&
 	    exists($$style_for_target{'/'."$token->[1]"})) {
 	    $Apache::lonxml::usestyle=0;
 	    my $string=$$style_for_target{'/'.$token->[1]}.
-	      '<LONCAPA_INTERNAL_TURN_STYLE_ON />';
+	      '<LONCAPA_INTERNAL_TURN_STYLE_ON end="'.$token->[1].'" />';
 	    &Apache::lonxml::newparser($pars,\$string);
+	    $Apache::lonxml::style_values=$Apache::lonxml::style_end_values;
+	    $Apache::lonxml::style_end_values='';
+	    $dontpop=1;
 	} else {
-	  $result = &callsub("end_$token->[1]", $target, $token, $stack,
-			     $parstack, $pars,$safeeval, $style_for_target);
+	    #clear out any tags that didn't end
+	    while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
+		my $lasttag=$$stack[-1];
+		if ($token->[1] =~ /^$lasttag$/i) {
+		    &Apache::lonxml::warning('Using tag &lt;/'.$token->[1].'&gt; on line '.$token->[3].' as end tag to &lt;'.$$stack[-1].'&gt;');
+		    last;
+		} else {
+		    &Apache::lonxml::warning('Found tag &lt;/'.$token->[1].'&gt; on line '.$token->[3].' when looking for &lt;/'.$$stack[-1].'&gt; in file');
+		    &end_tag($stack,$parstack,$token);
+		}
+	    }
+	    $result = &callsub("end_$token->[1]", $target, $token, $stack,
+			       $parstack, $pars,$safeeval, $style_for_target);
 	}
       } else {
 	&Apache::lonxml::error("Unknown token event :$token->[0]:$token->[1]:");
       }
       #evaluate variable refs in result
       if ($result ne "") {
+	  my $extras;
+	  if (!$Apache::lonxml::usestyle) {
+	      $extras=$Apache::lonxml::style_values;
+	  }
 	if ( $#$parstack > -1 ) {
-	  $result=&Apache::run::evaluate($result,$safeeval,$$parstack[-1]);
+	  $result=&Apache::run::evaluate($result,$safeeval,$extras.$$parstack[-1]);
 	} else {
-	  $result= &Apache::run::evaluate($result,$safeeval,'');
+	  $result= &Apache::run::evaluate($result,$safeeval,$extras);
 	}
       }
       if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
@@ -577,9 +586,10 @@ sub inner_xmlparse {
       }
       $result = '';
 
-      if ($token->[0] eq 'E') { 
+      if ($token->[0] eq 'E' && !$dontpop) {
 	&end_tag($stack,$parstack,$token);
       }
+      $dontpop=0;
     }	
     if ($#$pars > -1) {
 	pop @$pars;
@@ -1017,8 +1027,6 @@ sub newparser {
   } else {
     push (@Apache::lonxml::pwd, $dir);
   } 
-#  &Apache::lonxml::debug("pwd:$#Apache::lonxml::pwd");
-#  &Apache::lonxml::debug("pwd:$Apache::lonxml::pwd[$#Apache::lonxml::pwd]");
 }
 
 sub parstring {
@@ -1182,37 +1190,37 @@ sub get_target {
 }
 
 sub handler {
-  my $request=shift;
-
-  my $target=&get_target();
-
-  $Apache::lonxml::debug=0;
-
-  if ($ENV{'browser.mathml'}) {
-    $request->content_type('text/xml');
-  } else {
-    $request->content_type('text/html');
-  }
-  &Apache::loncommon::no_cache($request);
-  $request->send_http_header;
-
-  return OK if $request->header_only;
+    my $request=shift;
+    
+    my $target=&get_target();
+    
+    $Apache::lonxml::debug=$ENV{'user.debug'};
+    
+    if ($ENV{'browser.mathml'}) {
+	$request->content_type('text/xml');
+    } else {
+	$request->content_type('text/html');
+    }
+    &Apache::loncommon::no_cache($request);
+    $request->send_http_header;
+    
+    return OK if $request->header_only;
 
 
-  my $file=&Apache::lonnet::filelocation("",$request->uri);
+    my $file=&Apache::lonnet::filelocation("",$request->uri);
 #
 # Edit action? Save file.
 #
-  unless ($ENV{'request.state'} eq 'published') {
-      if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) {
-	  &storefile($file,$ENV{'form.filecont'});
-      }
-  }
-  my %mystyle;
-  my $result = '';
-  my $filecontents=&Apache::lonnet::getfile($file);
-  if ($filecontents eq -1) {
-    $result=(<<ENDNOTFOUND);
+    unless ($ENV{'request.state'} eq 'published') {
+	if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) {
+	    &storefile($file,$ENV{'form.filecont'});
+	}
+    }
+    my %mystyle;
+    my $result = '';
+    my $filecontents=&Apache::lonnet::getfile($file);
+    if ($filecontents eq -1) {
+	$result=(<<ENDNOTFOUND);
 <html>
 <head>
 <title>File not found</title>
@@ -1223,41 +1231,41 @@ sub handler {
 </html>
 ENDNOTFOUND
     $filecontents='';
-    if ($ENV{'request.state'} ne 'published') {
-      $filecontents=&createnewhtml();
-      $ENV{'form.editmode'}='Edit'; #force edit mode
-    }
-  } else {
-    unless ($ENV{'request.state'} eq 'published') {
-      if ($ENV{'form.attemptclean'}) {
-	$filecontents=&htmlclean($filecontents,1);
-      }
-    }
-    if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {
-      $result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
-					  '',%mystyle);
+	if ($ENV{'request.state'} ne 'published') {
+	    $filecontents=&createnewhtml();
+	    $ENV{'form.editmode'}='Edit'; #force edit mode
+	}
+    } else {
+	unless ($ENV{'request.state'} eq 'published') {
+	    if ($ENV{'form.attemptclean'}) {
+		$filecontents=&htmlclean($filecontents,1);
+	    }
+	}
+	if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {
+	    $result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
+						'',%mystyle);
+	}
     }
-  }
-
+    
 #
 # Edit action? Insert editing commands
 #
-  unless ($ENV{'request.state'} eq 'published') {
-    if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) {
-	my $displayfile=$request->uri;
-        $displayfile=~s/^\/[^\/]*//;
-      $result='<html><body bgcolor="#FFFFFF"><h3>'.$displayfile.
-              '</h3></body></html>';
-      $result=&inserteditinfo($result,$filecontents);
+    unless ($ENV{'request.state'} eq 'published') {
+	if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) {
+	    my $displayfile=$request->uri;
+	    $displayfile=~s/^\/[^\/]*//;
+	    $result='<html><body bgcolor="#FFFFFF"><h3>'.$displayfile.
+		'</h3></body></html>';
+	    $result=&inserteditinfo($result,$filecontents);
+	}
     }
-  }
-
-  writeallows($request->uri);
-
-
-  $request->print($result);
-
-  return OK;
+    
+    writeallows($request->uri);
+    
+
+    $request->print($result);
+    
+    return OK;
 }
 
 sub display_title {
@@ -1308,7 +1316,7 @@ sub error {
 
 sub warning {
   $warningcount++;
-  if ($ENV{'request.state'} eq 'construct') {
+  if ($ENV{'request.state'} eq 'construct' || $Apache::lonxml::debug) {
     print "<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n";
   }
 }