--- loncom/xml/lonxml.pm	2001/05/04 21:17:24	1.72
+++ loncom/xml/lonxml.pm	2001/05/26 17:27:28	1.79
@@ -6,10 +6,12 @@
 # 6/1/1 Gerd Kortemeyer
 # 2/21,3/13 Guy
 # 3/29,5/4 Gerd Kortemeyer
+# 5/10 Scott Harrison
+# 5/26 Gerd Kortemeyer
 
 package Apache::lonxml; 
 use vars 
-qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate);
+qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace);
 use strict;
 use HTML::TokeParser;
 use Safe;
@@ -33,6 +35,9 @@ use Apache::run;
 use Apache::londefdef;
 use Apache::scripttag;
 use Apache::edit;
+use Apache::lonnet;
+use Apache::File;
+
 #==================================================   Main subroutine: xmlparse  
 #debugging control, to turn on debugging modify the correct handler
 $Apache::lonxml::debug=0;
@@ -56,6 +61,11 @@ $metamode = 0;
 # turns on and of run::evaluate actually derefencing var refs
 $evaluate = 1;
 
+# data structure for eidt mode, determines what tags can go into what other tags
+%insertlist=();
+
+#stores the list of active tag namespaces
+@namespace=();
 
 sub xmlbegin {
   my $output='';
@@ -162,6 +172,7 @@ sub xmlparse {
  my $safehole = new Safe::Hole;
  $safeeval->permit("entereval");
  $safeeval->permit(":base_math");
+ $safeeval->permit("sort");
  $safeeval->deny(":base_io");
  $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');
 #need to inspect this class of ops
@@ -364,14 +375,16 @@ sub callsub {
     &Apache::lonxml::debug("nodefalt:$nodefault:");
     if ($currentstring eq '' && $nodefault eq '') {
       if ($target eq 'edit') {
+	&Apache::lonxml::debug("doing default edit for $token->[1]");
 	if ($token->[0] eq 'S') {
-	  $currentstring = &Apache::edit::tag_start($token,$target);
+	  $currentstring = &Apache::edit::tag_start($target,$token);
 	} elsif ($token->[0] eq 'E') {
-	  $currentstring = &Apache::edit::tag_end($token,$target);
+	  $currentstring = &Apache::edit::tag_end($target,$token);
 	}
       } elsif ($target eq 'modified') {
 	if ($token->[0] eq 'S') {
 	  $currentstring = $token->[4];
+	  $currentstring.=&Apache::edit::handle_insert();
 	} else {
 	  $currentstring = $token->[2];
 	}
@@ -561,6 +574,47 @@ ENDSCRIPT
     return $result;
 }
 
+sub storefile {
+    my ($file,$contents)=@_;
+    if (my $fh=Apache::File->new('>'.$file)) {
+	print $fh $contents;
+        $fh->close();
+    }
+}
+
+sub inserteditinfo {
+      my ($result,$filecontents)=@_;
+      unless ($filecontents) {
+	  $filecontents=(<<SIMPLECONTENT);
+<html>
+<head>
+<title>
+                           Title of Document Goes Here
+</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+                           Body of Document Goes Here
+
+</body>
+</html>
+SIMPLECONTENT
+      }
+      my $editheader='<a href="#editsection">Edit below</a><hr />';
+      my $editfooter=(<<ENDFOOTER);
+<hr />
+<a name="editsection" />
+<form method="post">
+<textarea cols="80" rows="40" name="filecont">$filecontents</textarea>
+<br />
+<input type="submit" name="savethisfile" value="Save this file" />
+</form>
+ENDFOOTER
+      $result=~s/(\<body[^\>]*\>)/$1$editheader/is;
+      $result=~s/(\<\/body\>)/$editfooter/is;
+      return $result;
+}
+
 sub handler {
   my $request=shift;
 
@@ -574,30 +628,46 @@ sub handler {
     $request->content_type('text/html');
   }
   
-#  $request->print(<<ENDHEADER);
-#<html>
-#<head>
-#<title>Just test</title>
-#</head>
-#<body bgcolor="#FFFFFF">
-#ENDHEADER
-#  &Apache::lonhomework::send_header($request);
   $request->send_http_header;
   
   return OK if $request->header_only;
 
 
   my $file=&Apache::lonnet::filelocation("",$request->uri);
+#
+# Edit action? Save file.
+#
+  unless ($ENV{'request.state'} eq 'published') {
+      if ($ENV{'form.savethisfile'}) {
+	  &storefile($file,$ENV{'form.filecont'});
+      }
+  }
   my %mystyle;
   my $result = ''; 
   my $filecontents=&Apache::lonnet::getfile($file);
   if ($filecontents == -1) {
-    &Apache::lonxml::error("<b> Unable to find <i>$file</i></b>");
+    $result=(<<ENDNOTFOUND);
+<html>
+<head>
+<title>File not found</title>
+</head>
+<body bgcolor="#FFFFFF">
+<b>File not found: $file</b>
+</body>
+</html>
+ENDNOTFOUND
     $filecontents='';
   } else {
     $result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle);
   }
 
+#
+# Edit action? Insert editing commands
+#
+  unless ($ENV{'request.state'} eq 'published') {
+      $result=&inserteditinfo($result,$filecontents);
+  }
+
   $request->print($result);
 
   writeallows($request->uri);
@@ -611,7 +681,7 @@ sub debug {
 }
 
 sub error {
-  if ($Apache::lonxml::debug eq 1) {
+  if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) {
     print "<b>ERROR:</b>".$_[0]."<br />\n";
   } else {
     print "<b>An Error occured while processing this resource. The instructor has been notified.</b> <br />";
@@ -625,19 +695,51 @@ sub error {
 	&Apache::lonmsg::user_normal_msg($user,$domain,"Error in $ENV{'request.filename'}",$_[0]);
       }
     }
-    
+
     #FIXME probably shouldn't have me get everything forever.
     &Apache::lonmsg::user_normal_msg('albertel','msu',"Error in $ENV{'request.filename'}",$_[0]);
-    #&Apache::lonmsg::user_normal_msg('albertel','103',"Error in $ENV{'request.filename'}",$_[0]);   
+    #&Apache::lonmsg::user_normal_msg('albertel','103',"Error in $ENV{'request.filename'}",$_[0]);
   }
 }
 
 sub warning {
-  #if ($Apache::lonxml::debug eq 1) {
+  if ($ENV{'request.state'} eq 'construct') {
     print "<b>W</b>ARNING<b>:</b>".$_[0]."<br />\n";
- # }
+  }
 }
 
+sub register_insert {
+  my @data = split /\n/, &Apache::lonnet::getfile('/home/httpd/lonTabs/insertlist.tab');
+  my $i;
+  my $tagnum=0;
+  my @order;
+  for ($i=0;$i < $#data; $i++) {
+    my $line = $data[$i];
+    if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }
+    if ( $line =~ /TABLE/ ) { last; }
+    my ($tag,$descrip,$function,$show) = split(/,/, $line);
+    $insertlist{"$tagnum.tag"} = $tag;
+    $insertlist{"$tagnum.description"} = $descrip;
+    $insertlist{"$tagnum.function"} = $function;
+    $insertlist{"$tagnum.show"}= $show;
+    $tagnum++;
+  }
+  $i++; #skipping TABLE line
+  $tagnum = 0;
+  for (;$i < $#data;$i++) {
+    my $line = $data[$i];
+    my ($mnemonic,@which) = split(/ +/,$line);
+    my $tag = $insertlist{"$tagnum.tag"};
+    for (my $j=0;$j <$#which;$j++) {
+      if ( $which[$j] eq 'Y' ) {
+	if ($insertlist{"$j.show"} ne 'no') {
+	  push(@{ $insertlist{"$tag.which"} },$j);
+	}
+      }
+    }
+    $tagnum++;
+  }
+}
 1;
 __END__