File:  [LON-CAPA] / loncom / publisher / londiff.pm
Revision 1.3: download - view: text, annotated - select for diffs
Wed May 2 23:00:05 2001 UTC (23 years ago) by www
Branches: MAIN
CVS tags: HEAD
Diff for current version, and unified output

# The LearningOnline Network with CAPA
# Handler to show differences between file versions
#
# (Handler to retrieve an old version of a file
#
# (Publication Handler
# 
# (TeX Content Handler
#
# 05/29/00,05/30,10/11 Gerd Kortemeyer)
#
# 11/28,11/29,11/30,12/01,12/02,12/04,12/23 Gerd Kortemeyer
# 03/23 Guy Albertelli
# 03/24,03/29 Gerd Kortemeyer)
#
# 03/31,04/03 Gerd Kortemeyer)
#
# 05/02/01 Gerd Kortemeyer

package Apache::londiff;

use strict;
use Apache::File;
use File::Copy;
use Algorithm::Diff qw(diff);
use Apache::Constants qw(:common :http :methods);


sub handler {

  my $r=shift;

# Get query string for limited number of parameters

    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 'filename') || ($name eq 'versiontwo') || 
           ($name eq 'versionone')) {
           unless ($ENV{'form.'.$name}) {
              $ENV{'form.'.$name}=$value;
	   }
       }
    } (split(/&/,$ENV{'QUERY_STRING'}));

# Get the files

  my @f1=();
  my @f2=();

  $r->content_type('text/html');
  $r->send_http_header;

  $r->print('<html><head><title>LON-CAPA Construction Diffs</title></head>');

  $r->print('<body bgcolor="#FFFFFF">');

  
  $r->print('<h1>Compare versions of <tt>'.$ENV{'form.filename'}.'</tt></h1>');

 if (&Apache::lonnet::fileembstyle(($ENV{'form.filename'}=~/\.(\w+)$/)) eq
      'ssi') {
  if ($ENV{'form.versionone'} eq 'priv') {
      my $fn='/home/'.$ENV{'user.name'}.'/public_html/'.$ENV{'form.filename'};
      if (-e $fn) {
	  my $fh=Apache::File->new($fn);
          my $line;
          while($line=<$fh>) {
             chomp($line);
             $f1[$#f1+1]=$line;
	 }
      }
  } else {
      my $fn=
       '/home/httpd/html//res/'.$ENV{'user.domain'}.'/'.$ENV{'user.name'}.'/';
      if ($ENV{'form.versionone'}) {
         my ($main,$suffix)=($ENV{'form.filename'}=~/^(.+)\.(\w+)$/);
         $fn.=$main.'.'.$ENV{'form.versionone'}.'.'.$suffix;
      } else {
         $fn.=$ENV{'form.filename'};
      }
      @f1=split(/\n/,&Apache::lonnet::getfile($fn));      
  }


  if ($ENV{'form.versiontwo'} eq 'priv') {
      my $fn='/home/'.$ENV{'user.name'}.'/public_html/'.$ENV{'form.filename'};
      if (-e $fn) {
	  my $fh=Apache::File->new($fn);
          my $line;
          while($line=<$fh>) {
             chomp($line);
             $f2[$#f2+1]=$line;
	 }
      }
  } else {
      my $fn=
       '/home/httpd/html/res/'.$ENV{'user.domain'}.'/'.$ENV{'user.name'}.'/';
      if ($ENV{'form.versiontwo'}) {
         my ($main,$suffix)=($ENV{'form.filename'}=~/^(.+)\.(\w+)$/);
         $fn.=$main.'.'.$ENV{'form.versiontwo'}.'.'.$suffix;
      } else {
         $fn.=$ENV{'form.filename'};
      }
      @f2=split(/\n/,&Apache::lonnet::getfile($fn));      
  }

# Run diff

  my $diffs = diff(\@f1, \@f2);

# Start page output

  my $chunk;
  my $line;

  $r->print('<pre>');

  foreach $chunk (@$diffs) {

    foreach $line (@$chunk) {
      my ($sign, $lineno, $text) = @$line;
      $text=~s/\</\&lt\;/g;
      $text=~s/\>/\&gt\;/g;
      $lineno=substr($lineno.'        ',0,7);
      $r->print('<font color='.(($sign eq '+')?'green':'red').'>'.
                $sign.' '.$lineno.' '.$text."</font>\n");
    }
    $r->print("<hr>\n");
  }
  $r->print('</pre>');

} else {
    $r->print('<h1><font color=red>Binary File</font></h1>');
}
  $r->print('</body></html>');
  return OK;  
}


1;
__END__





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