Diff for /loncom/publisher/loncleanup.pm between versions 1.1 and 1.21

version 1.1, 2005/05/28 01:32:33 version 1.21, 2023/07/23 13:07:24
Line 34  use strict; Line 34  use strict;
 use Apache::File;  use Apache::File;
 use File::Copy;  use File::Copy;
 use Apache::Constants qw(:common :http :methods);  use Apache::Constants qw(:common :http :methods);
 use Apache::loncacc;  
 use Apache::loncommon();  use Apache::loncommon();
   use Apache::lonhtmlcommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
   use HTML::Entities();
    
   
 sub latextrans {  sub latextrans {
     my $symbolfont=shift;      my $symbolfont=shift;
Line 208  sub symbolfontreplace { Line 212  sub symbolfontreplace {
 }  }
   
 sub htmlclean {  sub htmlclean {
     my ($raw,$full)=@_;      my ($raw,$full,$blocklinefeed,$blockemptytags,$blocklowercasing,$blockdesymboling)=@_;
 # Take care of CRLF etc  # Take care of CRLF etc
       unless ($blocklinefeed) {
     $raw=~s/\r\f/\n/gs; $raw=~s/\f\r/\n/gs;   $raw=~s/\r\f/\n/gs; $raw=~s/\f\r/\n/gs;
     $raw=~s/\r\n/\n/gs; $raw=~s/\n\r/\n/gs;   $raw=~s/\r\n/\n/gs; $raw=~s/\n\r/\n/gs;
     $raw=~s/\f/\n/gs; $raw=~s/\r/\n/gs;   $raw=~s/\f/\n/gs; $raw=~s/\r/\n/gs;
     $raw=~s/\&\#10\;/\n/gs; $raw=~s/\&\#13\;/\n/gs;   $raw=~s/\&\#10\;/\n/gs; $raw=~s/\&\#13\;/\n/gs;
       }
 # Generate empty tags, remove wrong end tags  # Generate empty tags, remove wrong end tags
     $raw=~s/\<(br|hr|img|meta|allow|basefont)([^\>\/]*?)\>/\<$1$2 \/\>/gis;      unless ($blockemptytags) {
     $raw=~s/\<\/(br|hr|img|meta|allow|basefont)\>//gis;   $raw=~s/\<(br|hr|img|meta|embed|allow|basefont)([^\>]*?)\>/\<$1$2 \/\>/gis;
     unless ($full) {   $raw=~s/\<\/(br|hr|img|meta|embed|allow|basefont)\>//gis;
        $raw=~s/\<[\/]*(body|head|html)\>//gis;   $raw=~s/\/ \/\>/\/\>/gs;
    unless ($full) {
       $raw=~s/\<[\/]*(body|head|html)\>//gis;
    }
     }      }
 # Make standard tags lowercase  # Make standard tags lowercase
     foreach ('html','body','head','meta','h1','h2','h3','h4','b','i','m',      unless ($blocklowercasing) {
              'table','tr','td','th','p','br','hr','img','embed','font',   foreach ('html','body','head','meta','h1','h2','h3','h4','b','i','m',
              'a','strong','center','title','basefont','li','ol','ul',   'table','tr','td','th','p','br','hr','img','embed','font',
              'input','select','form','option','script','pre') {   'a','strong','center','title','basefont','li','ol','ul',
  $raw=~s/\<$_\s*\>/\<$_\>/gis;   'input','select','form','option','script','pre') {
         $raw=~s/\<\/$_\s*\>/<\/$_\>/gis;      $raw=~s/\<$_\s*\>/\<$_\>/gis;
         $raw=~s/\<$_\s([^\>]*)\>/<$_ $1\>/gis;      $raw=~s/\<\/$_\s*\>/<\/$_\>/gis;
       $raw=~s/\<$_\s([^\>]*)\>/<$_ $1\>/gis;
    }
       }
   # Replace <font face="symbol">
       unless ($blockdesymboling) {
    $raw=&symbolfontreplace($raw);
     }      }
     return $raw;      return $raw;
 }  }
   
 sub phaseone {  sub phaseone {
       my ($r,$fn,$uname,$udom)=@_;
       $r->print(
           &Apache::lonhtmlcommon::start_pick_box()
          .&Apache::lonhtmlcommon::row_title(&mt('Select actions to attempt'))
          .'<label>'
          .'<input type="checkbox" name="linefeed" checked="checked" /> '
          .&mt('Linefeeds, formfeeds, and carriage returns')
          .'</label><br />'
          .'<label>'
          .'<input type="checkbox" name="empty" checked="checked" /> '
          .&mt('Empty tags')
          .'</label><br />'
          .'<label>'
          .'<input type="checkbox" name="lower" checked="checked" /> '
          .&mt('Lower casing')
          .'</label><br />'
          .'<label>'
          .'<input type="checkbox" name="symbol" checked="checked" /> '
          .&mt('Symbol font')
          .'</label>'
          .&Apache::lonhtmlcommon::row_closure(1)
          .&Apache::lonhtmlcommon::end_pick_box()
       );
   
       $r->print(
           '<input type="hidden" name="phase" value="two" />'
          .'<p>'
          .'<input type="submit" value="'.&mt('Next').'" />'
          .'</p>'
       );
 }  }
   
 sub phasetwo {  sub phasetwo {
       # Check original file
       my ($r,$fn,$uname,$udom)=@_;
       my $text='';
       my $londocroot = $r->dir_config('lonDocRoot');
       if (open(IN,"<$londocroot/priv/$udom/$uname".$fn)) {
           while (my $line=<IN>) {
       $text.=$line;
           }
           close(IN);
       }
       # Check if any selection was made
       if ($env{'form.linefeed'} ne 'on' &&
           $env{'form.empty'} ne 'on' &&
           $env{'form.lower'} ne 'on' &&
           $env{'form.symbol'} ne 'on') {
           $r->print(
               '<p class="LC_warning">'
              .&mt('Please select at least one option.')
              .'</p>'
              .'<p><a href="javascript:history.back();">'.&mt('Back').'</p>'
           );
           return;
       }
   
       my $uri="/priv/$udom/$uname".$fn;
       my $result=&Apache::lonnet::ssi_body($uri,
    ('grade_target'=>'web',
     'return_only_error_and_warning_counts' => 1));
       my ($errorcount,$warningcount)=split(':',$result);
   
       # Display results for original file
       $r->print(
           &Apache::lonhtmlcommon::start_pick_box()
          .&Apache::lonhtmlcommon::row_title(&mt('Original file'))
          .&Apache::lonhtmlcommon::confirm_success(
              &mt('[quant,_1,error]',$errorcount), $errorcount)
          .'<br />'
          .&Apache::lonhtmlcommon::confirm_success(
              &mt('[quant,_1,warning]',$warningcount), $warningcount)
          .&Apache::lonhtmlcommon::row_closure()
       );
   
       # Clean up file
       $text=&htmlclean($text,1,
                  ($env{'form.linefeed'} ne 'on'),
                  ($env{'form.empty'} ne 'on'),
                  ($env{'form.lower'} ne 'on'),
                  ($env{'form.symbol'} ne 'on'));
       my ($main,$ext)=($fn=~/^(.*)\.(\w+)/);
       my $newfn=$main.'_Auto_Cleaned_Up.'.$ext;
       if (open(OUT,">$londocroot/priv/$udom/$uname".$newfn)) {
           print OUT $text;
           close(OUT);
       }
       my $newuri="/priv/$udom/$uname".$newfn;
       $result=&Apache::lonnet::ssi_body($newuri,
                                            ('grade_target'=>'web',
                                             'return_only_error_and_warning_counts' => 1));
       ($errorcount,$warningcount)=split(':',$result);
   
       # Display results for cleaned up file
       $r->print(
           &Apache::lonhtmlcommon::row_title(&mt('Cleaned up file'))
          .&Apache::lonhtmlcommon::confirm_success(
              &mt('[quant,_1,error]',$errorcount), $errorcount)
          .'<br />'
          .&Apache::lonhtmlcommon::confirm_success(
              &mt('[quant,_1,warning]',$warningcount), $warningcount)
          .&Apache::lonhtmlcommon::row_closure()
       );
   
       # Display actions
       $r->print(
           &Apache::lonhtmlcommon::row_title(&mt('Actions'))
          .'<ul>'
          .'<li><a href="'.$newuri.'" target="prev">'
          .&mt('Open (and edit) cleaned up file in new window')
          .'</a></li>'
          .'<li><a href="'
          .&HTML::Entities::encode(
               '/adm/diff?filename='.&escape($uri)
              .'&versionone=priv&filetwo='.&escape($newuri))
          .'" target="prev">'
          .&mt('Show diffs in new window')
          .'</a></li>'
          .'</ul>'
          .&Apache::lonhtmlcommon::row_closure(1)
          .&Apache::lonhtmlcommon::end_pick_box()
          .'<p>'
          .'<input type="hidden" name="phase" value="three" />'
          .'<input type="submit" name="accept" value="'
          .&mt('Clean Up').'" />'
          .' <input type="submit" name="reject" value="'
          .&mt('Cancel').'" />'
          .'</p>'
       );
   }
   
   sub phasethree {
       my ($r,$fn,$uname,$udom)=@_;
       my $old=$r->dir_config('lonDocRoot')."/priv/$udom/$uname".$fn;
       my ($main,$ext)=($fn=~/^(.*)\.(\w+)/);
       my $newfn=$main.'_Auto_Cleaned_Up.'.$ext;
       my $new=$r->dir_config('lonDocRoot')."/priv/$udom/$uname".$newfn;
       if ($env{'form.accept'}) {
           $r->print(
           '<p class="LC_info">'
          .&mt('Accepting changes...')
          .'</p>'
       );
           move($new,$old);
       } else {
           $r->print(
           '<p class="LC_info">'
          .&mt('Rejecting changes...')
          .'</p>'
           );
           unlink($new);
       }
       $r->print(
           '<p>'
          .&Apache::lonhtmlcommon::confirm_success(&mt('Done')));
           '</p>'
 }  }
   
 # ---------------------------------------------------------------- Main Handler  # ---------------------------------------------------------------- Main Handler
 sub handler {  sub handler {
   
   my $r=shift;      my $r=shift;
       my $fn='';
   
 # Get query string for limited number of parameters  # Get query string for limited number of parameters
   
   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
   ['filename']);      ['filename']);
   
       if ($env{'form.filename'}) {
    $fn=$env{'form.filename'};
    $fn=~s{^https?\://[^/]+}{};
       } else {
    $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
          ' unspecified filename for cleanup', $r->filename); 
    return HTTP_NOT_FOUND;
       }
   
   if ($env{'form.filename'}) {      unless ($fn) { 
       $fn=$env{'form.filename'};   $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
       $fn=~s/^http\:\/\/[^\/]+//;         ' trying to cleanup non-existing file', $r->filename); 
   } else {   return HTTP_NOT_FOUND;
      $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.      } 
          ' unspecified filename for cleanup', $r->filename);   
      return HTTP_NOT_FOUND;  
   }  
   
   unless ($fn) {   
      $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.  
          ' trying to cleanup non-existing file', $r->filename);   
      return HTTP_NOT_FOUND;  
   }   
   
 # ----------------------------------------------------------- Start page output  # ----------------------------------------------------------- Start page output
   my $uname;      my $uname;
   my $udom;      my $udom;
   
       ($uname,$udom)=&Apache::lonnet::constructaccess($fn);
       unless (($uname) && ($udom)) {
    $r->log_reason($uname.' at '.$udom.
          ' trying to cleanup file '.$env{'form.filename'}.
          ' ('.$fn.') - not authorized', 
          $r->filename); 
    return HTTP_NOT_ACCEPTABLE;
       }
   
   ($uname,$udom)=      &Apache::loncommon::content_type($r,'text/html');
     &Apache::loncacc::constructaccess($fn,$r->dir_config('lonDefDomain'));      $r->send_http_header;
   unless (($uname) && ($udom)) {  
      $r->log_reason($uname.' at '.$udom.      # Breadcrumbs
          ' trying to cleanup file '.$env{'form.filename'}.      my $text = 'Authoring Space';
          ' ('.$fn.') - not authorized',       my $href = &Apache::loncommon::authorspace($fn);
          $r->filename);       if ($env{'request.course.id'}) {
      return HTTP_NOT_ACCEPTABLE;          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
   }          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           if ($href eq "/priv/$cdom/$cnum/") {
   $fn=~s/\/\~(\w+)//;              $text = 'Course Authoring Space';
           }
   &Apache::loncommon::content_type($r,'text/html');      }
   $r->send_http_header;      my $brcrum = [{'href' => $href,
                      'text' => $text,
   $r->print('<html><head><title>LON-CAPA Construction Space</title></head>');                    {'href' => '',
                      'text' => 'Cleanup XML Document'}];
   $r->print(&Apache::loncommon::bodytag('Cleanup XML Document'));  
       $fn=~s{^/priv/$LONCAPA::domain_re/$LONCAPA::username_re}{};
   if ($env{'form.phase'} eq 'two') {  
       &phasetwo($r,$fn,$uname,$udom);      $r->print(&Apache::loncommon::start_page('Cleanup XML Document',
   } else {                                               undef,
       &phaseone($r,$fn,$uname,$udom);                                               {'bread_crumbs' => $brcrum,}));
   }      $r->print('<h2>'.$fn.'</h2>'.
                 '<form action="/adm/cleanup" method="post">'.
                 '<input type="hidden" name="filename" value="'.$env{'form.filename'}.'" />');
       unless ($fn=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm|sty)$/) {
    $r->print('<p class="LC_warning">'.&mt('Cannot cleanup this filetype').'</p>');
       } else {
    if ($env{'form.phase'} eq 'three') {
       &phasethree($r,$fn,$uname,$udom);
    } elsif ($env{'form.phase'} eq 'two') {
       &phasetwo($r,$fn,$uname,$udom);
    } else {
       &phaseone($r,$fn,$uname,$udom);
    }
       }
       my $dir=$fn;
       $dir=~s{[^/]+$}{};
       $r->print(
           '</form>'
          .&Apache::lonhtmlcommon::actionbox(
               ['<a href="/priv/'.$udom.'/'.$uname.$fn.'">'.
                    &mt('Back to Source File').'</a>',
               '<a href="/priv/'.$udom.'/'.$uname.$dir.'">'.
                   &mt('Back to Source Directory').'</a>'])
          .&Apache::loncommon::end_page()
       );
   
   $r->print('</body></html>');      return OK;  
   return OK;    
 }  }
   
 1;  1;

Removed from v.1.1  
changed lines
  Added in v.1.21


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>