--- loncom/xml/lonxml.pm	2001/07/27 00:18:59	1.103
+++ loncom/xml/lonxml.pm	2001/08/07 22:57:50	1.107
@@ -12,12 +12,15 @@
 # 6/2,6/3,6/8,6/9 Gerd Kortemeyer
 # 6/12,6/13 H. K. Ng
 # 6/16 Gerd Kortemeyer
+# 7/27 H. K. Ng
+# 8/7 Gerd Kortemeyer
 
 package Apache::lonxml; 
 use vars 
 qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace);
 use strict;
 use HTML::TokeParser;
+use HTML::TreeBuilder;
 use Safe;
 use Safe::Hole;
 use Math::Cephes qw(:trigs :hypers :bessels erf erfc);
@@ -131,6 +134,7 @@ sub fontsettings() {
 sub registerurl {
     my $forcereg=shift;
     if ($Apache::lonxml::registered) { return ''; }
+    $Apache::lonxml::registered=1;
     if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) {
         my $hwkadd='';
         if ($ENV{'REQUEST_URI'}=~/\.(problem|exam|quiz|assess|survey|form)$/) {
@@ -279,6 +283,27 @@ sub xmlparse {
  return $finaloutput;
 }
 
+sub htmlclean {
+    my ($raw,$full)=@_;
+
+    my $tree = HTML::TreeBuilder->new;
+    $tree->ignore_unknown(0);
+    
+    $tree->parse($raw);
+
+    my $output= $tree->as_HTML(undef,' ');
+     
+    $output=~s/\<(br|hr|img)([^\>\/]*)\>/\<$1$2 \/\>/gis;
+    $output=~s/\<\/(br|hr|img)\>//gis;
+    unless ($full) {
+       $output=~s/\<[\/]*(body|head|html)\>//gis;
+    }
+
+    $tree = $tree->delete;
+
+    return $output;
+}
+
 sub inner_xmlparse {
   my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_;
   &Apache::lonxml::debug('Reentrant parser starting, again?');
@@ -807,7 +832,9 @@ SIMPLECONTENT
 <form method="post">
 <textarea cols="80" rows="40" name="filecont">$filecontents</textarea>
 <br />
-<input type="submit" name="savethisfile" value="Save this file" />
+<input type="submit" name="attemptclean" 
+       value="Save and then attempt to clean HTML" />
+<input type="submit" name="savethisfile" value="Save this" />
 </form>
 ENDFOOTER
       $result=~s/(\<body[^\>]*\>)/$1$editheader/is;
@@ -838,7 +865,7 @@ sub handler {
 # Edit action? Save file.
 #
   unless ($ENV{'request.state'} eq 'published') {
-      if ($ENV{'form.savethisfile'}) {
+      if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) {
 	  &storefile($file,$ENV{'form.filecont'});
       }
   }
@@ -858,6 +885,11 @@ sub handler {
 ENDNOTFOUND
     $filecontents='';
   } else {
+      unless ($ENV{'request.state'} eq 'published') {
+         if ($ENV{'form.attemptclean'}) {
+	    $filecontents=&htmlclean($filecontents,1);
+         }
+      }
     $result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle);
   }