File:  [LON-CAPA] / loncom / publisher / londiff.pm
Revision 1.4: download - view: text, annotated - select for diffs
Thu May 3 11:04:07 2001 UTC (23 years, 1 month ago) by www
Branches: MAIN
CVS tags: HEAD
Diff improvements

    1: # The LearningOnline Network with CAPA
    2: # Handler to show differences between file versions
    3: #
    4: # (Handler to retrieve an old version of a file
    5: #
    6: # (Publication Handler
    7: # 
    8: # (TeX Content Handler
    9: #
   10: # 05/29/00,05/30,10/11 Gerd Kortemeyer)
   11: #
   12: # 11/28,11/29,11/30,12/01,12/02,12/04,12/23 Gerd Kortemeyer
   13: # 03/23 Guy Albertelli
   14: # 03/24,03/29 Gerd Kortemeyer)
   15: #
   16: # 03/31,04/03 Gerd Kortemeyer)
   17: #
   18: # 05/02/01 Gerd Kortemeyer
   19: 
   20: package Apache::londiff;
   21: 
   22: use strict;
   23: use Apache::File;
   24: use File::Copy;
   25: use Algorithm::Diff qw(diff);
   26: use Apache::Constants qw(:common :http :methods);
   27: 
   28: 
   29: sub handler {
   30: 
   31:   my $r=shift;
   32: 
   33: # Get query string for limited number of parameters
   34: 
   35:     map {
   36:        my ($name, $value) = split(/=/,$_);
   37:        $value =~ tr/+/ /;
   38:        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
   39:        if (($name eq 'filename') || ($name eq 'versiontwo') || 
   40:            ($name eq 'versionone')) {
   41:            unless ($ENV{'form.'.$name}) {
   42:               $ENV{'form.'.$name}=$value;
   43: 	   }
   44:        }
   45:     } (split(/&/,$ENV{'QUERY_STRING'}));
   46: 
   47: # Get the files
   48: 
   49:   my @f1=();
   50:   my @f2=();
   51: 
   52:   $r->content_type('text/html');
   53:   $r->send_http_header;
   54: 
   55:   $r->print('<html><head><title>LON-CAPA Construction Diffs</title></head>');
   56: 
   57:   $r->print('<body bgcolor="#FFFFFF">');
   58: 
   59:   
   60:   $r->print('<h1>Compare versions of <tt>'.$ENV{'form.filename'}.'</tt></h1>');
   61: 
   62:  if (&Apache::lonnet::fileembstyle(($ENV{'form.filename'}=~/\.(\w+)$/)) eq
   63:       'ssi') {
   64:   if ($ENV{'form.versionone'} eq 'priv') {
   65:       my $fn='/home/'.$ENV{'user.name'}.'/public_html/'.$ENV{'form.filename'};
   66:       if (-e $fn) {
   67: 	  my $fh=Apache::File->new($fn);
   68:           my $line;
   69:           while($line=<$fh>) {
   70:              chomp($line);
   71:              $f1[$#f1+1]=$line;
   72: 	 }
   73:       }
   74:       $r->print('<h3>Construction Space Version</h3>');
   75:   } else {
   76:       my $fn=
   77:        '/home/httpd/html//res/'.$ENV{'user.domain'}.'/'.$ENV{'user.name'}.'/';
   78:       if ($ENV{'form.versionone'}) {
   79:          my ($main,$suffix)=($ENV{'form.filename'}=~/^(.+)\.(\w+)$/);
   80:          $fn.=$main.'.'.$ENV{'form.versionone'}.'.'.$suffix;
   81: 	 $r->print('<h3>Version '.$ENV{'form.versionone'}.'</h3>');
   82:       } else {
   83:          $fn.=$ENV{'form.filename'};
   84: 	 $r->print('<h3>Current Version</h3>');
   85:       }
   86:       @f1=split(/\n/,&Apache::lonnet::getfile($fn));      
   87:   }
   88: 
   89:   $r->print('versus');
   90: 
   91:   if ($ENV{'form.versiontwo'} eq 'priv') {
   92:       my $fn='/home/'.$ENV{'user.name'}.'/public_html/'.$ENV{'form.filename'};
   93:       if (-e $fn) {
   94: 	  my $fh=Apache::File->new($fn);
   95:           my $line;
   96:           while($line=<$fh>) {
   97:              chomp($line);
   98:              $f2[$#f2+1]=$line;
   99: 	 }
  100:       }
  101:       $r->print('<h3>Construction Space Version</h3>');
  102:   } else {
  103:       my $fn=
  104:        '/home/httpd/html/res/'.$ENV{'user.domain'}.'/'.$ENV{'user.name'}.'/';
  105:       if ($ENV{'form.versiontwo'}) {
  106:          my ($main,$suffix)=($ENV{'form.filename'}=~/^(.+)\.(\w+)$/);
  107:          $fn.=$main.'.'.$ENV{'form.versiontwo'}.'.'.$suffix;
  108: 	 $r->print('<h3>Version '.$ENV{'form.versiontwo'}.'</h3>');
  109:       } else {
  110:          $fn.=$ENV{'form.filename'};
  111: 	 $r->print('<h3>Current Version</h3>');
  112:       }
  113:       @f2=split(/\n/,&Apache::lonnet::getfile($fn));      
  114:   }
  115: 
  116: # Run diff
  117: 
  118:   my $diffs = diff(\@f1, \@f2);
  119: 
  120: # Start page output
  121: 
  122:   my $chunk;
  123:   my $line;
  124: 
  125:   $r->print('<pre>');
  126: 
  127:   foreach $chunk (@$diffs) {
  128: 
  129:     foreach $line (@$chunk) {
  130:       my ($sign, $lineno, $text) = @$line;
  131:       $text=~s/\</\&lt\;/g;
  132:       $text=~s/\>/\&gt\;/g;
  133:       $lineno=substr($lineno.'        ',0,7);
  134:       $r->print('<font color='.(($sign eq '+')?'green':'red').'>'.
  135:                 $sign.' '.$lineno.' '.$text."</font>\n");
  136:     }
  137:     $r->print("<hr>\n");
  138:   }
  139:   $r->print('</pre>');
  140: 
  141: } else {
  142:     $r->print('<h1><font color=red>Binary File</font></h1>');
  143: }
  144:   $r->print('</body></html>');
  145:   return OK;  
  146: }
  147: 
  148: 
  149: 1;
  150: __END__
  151: 
  152: 
  153: 
  154: 

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