--- loncom/xml/lonxml.pm	2001/03/27 16:57:20	1.63
+++ loncom/xml/lonxml.pm	2001/03/29 20:47:06	1.66
@@ -5,6 +5,7 @@
 # 11/6 Gerd Kortemeyer
 # 6/1/1 Gerd Kortemeyer
 # 2/21,3/13 Guy
+# 3/29 Gerd Kortemeyer
 
 package Apache::lonxml; 
 use vars 
@@ -29,7 +30,7 @@ sub register {
 sub printalltags {
   my $temp;
   foreach $temp (sort keys %Apache::lonxml::alltags) {
-#    &Apache::lonxml::debug("$temp -- $Apache::lonxml::alltags{$temp}");
+    &Apache::lonxml::debug("$temp -- $Apache::lonxml::alltags{$temp}");
   }
 }
 use Apache::style;
@@ -106,9 +107,7 @@ sub xmlparse {
        # add parameters list to another stack
        push (@parstack,&parstring($token));
        &increasedepth($token);       
-#       &Apache::lonxml::debug("Checking for $token->[1] style");
        if (exists $style_for_target{$token->[1]}) {
-#	   &Apache::lonxml::debug("Found $token->[1] style");
 	 if ($Apache::lonxml::redirection) {
 	   $Apache::lonxml::outputstack['-1'] .=  
 	     &recurse($style_for_target{$token->[1]},$target,$safeeval,
@@ -118,7 +117,6 @@ sub xmlparse {
 				    $safeeval,\%style_for_target,@parstack);
 	 }
        } else {
-#	   &Apache::lonxml::debug("No style for for $token->[1]");
 	 $result = &callsub("start_$token->[1]", $target, $token,\@parstack,
 			    \@pars, $safeeval, \%style_for_target);
        }              
@@ -304,7 +302,7 @@ sub increasedepth {
     $Apache::lonxml::olddepth=$Apache::lonxml::depth;
   }
   my $curdepth=join('_',@Apache::lonxml::depthcounter);
-#  &Apache::lonxml::debug("s $Apache::lonxml::depth : $Apache::lonxml::olddepth : $curdepth : $token->[1]\n");
+  &Apache::lonxml::debug("s $Apache::lonxml::depth : $Apache::lonxml::olddepth : $curdepth : $token->[1]\n");
 #print "<br />s $Apache::lonxml::depth : $Apache::lonxml::olddepth : $curdepth : $token->[1]\n";
 }
 
@@ -320,7 +318,7 @@ sub decreasedepth {
     $Apache::lonxml::depth='-1';
   }
   my $curdepth=join('_',@Apache::lonxml::depthcounter);
-#  &Apache::lonxml::debug("e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n");
+  &Apache::lonxml::debug("e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n");
 #print "<br />e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n";
 }
 
@@ -410,17 +408,63 @@ sub writeallows {
     &Apache::lonnet::appenv(%httpref);
 }
 
+#
+# Afterburner handles anchors, highlights and links
+#
+
+sub afterburn {
+    my $result=shift;
+    map {
+       my ($name, $value) = split(/=/,$_);
+       $value =~ tr/+/ /;
+       $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
+       if (($name eq 'highlight')||($name eq 'anchor')||($name eq 'link')) {
+           unless ($ENV{'form.'.$name}) {
+              $ENV{'form.'.$name}=$value;
+	   }
+       }
+    } (split(/&/,$ENV{'QUERY_STRING'}));
+    if ($ENV{'form.highlight'}) {
+        map {
+           my $anchorname=$_;
+	   my $matchthis=$anchorname;
+           $matchthis=~s/\_+/\\s\+/g;
+           $result=~s/($matchthis)/\<font color=\"red\"\>$1\<\/font\>/gs;
+       } split(/\,/,$ENV{'form.highlight'});
+    }
+    if ($ENV{'form.link'}) {
+        map {
+           my ($anchorname,$linkurl)=split(/\>/,$_);
+	   my $matchthis=$anchorname;
+           $matchthis=~s/\_+/\\s\+/g;
+           $result=~s/($matchthis)/\<a href=\"$linkurl\"\>$1\<\/a\>/gs;
+       } split(/\,/,$ENV{'form.link'});
+    }
+    if ($ENV{'form.anchor'}) {
+        my $anchorname=$ENV{'form.anchor'};
+	my $matchthis=$anchorname;
+        $matchthis=~s/\_+/\\s\+/g;
+        $result=~s/($matchthis)/\<a name=\"$anchorname\"\>$1\<\/a\>/s;
+        $result.=(<<"ENDSCRIPT");
+<script>
+    document.location.hash='$anchorname';
+</script>
+ENDSCRIPT
+    }
+    return $result;
+}
+
 sub handler {
   my $request=shift;
   
-  my $target='tex';
-  $Apache::lonxml::debug=1;
+  my $target='web';
+  $Apache::lonxml::debug=0;
   if ($ENV{'browser.mathml'}) {
     $request->content_type('text/xml');
   } else {
     $request->content_type('text/html');
   }
-
+  
 #  $request->print(<<ENDHEADER);
 #<html>
 #<head>
@@ -430,20 +474,12 @@ sub handler {
 #ENDHEADER
 #  &Apache::lonhomework::send_header($request);
   $request->send_http_header;
-
+  
   return OK if $request->header_only;
 
-##  $request->print(&Apache::lontexconvert::header());
-
-##  $request->print('<body bgcolor="#FFFFFF">'."\n");
-
-  if ($target eq 'tex') {
-
-
-
-  } else {
-         $request->print(&Apache::lontexconvert::header());
-         $request->print('<body bgcolor="#FFFFFF">'."\n");
+  if ($target eq 'web') {
+    $request->print(&Apache::lontexconvert::header());
+    $request->print('<body bgcolor="#FFFFFF">'."\n");
   }
 
   my $file=&Apache::lonnet::filelocation("",$request->uri);
@@ -456,17 +492,22 @@ sub handler {
   } else {
     $result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle);
   }
+#
+# Afterburner
+#
+  if ($ENV{'QUERY_STRING'}) {
+      $result=&afterburn($result);
+  }
   $request->print($result);
 
 
-##  $request->print('</body>');
   if ($target eq 'tex') {
 #    $request->print('\end{document}'."\n");
-  } else {
+  } elsif ($target eq 'web') {
     $request->print('</body>');
     $request->print(&Apache::lontexconvert::footer());
   }
-##  $request->print(&Apache::lontexconvert::footer());
+
   writeallows($request->uri);
   return OK;
 }