Annotation of loncom/publisher/londiff.pm, revision 1.6

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to show differences between file versions
                      3: #
1.6     ! albertel    4: # $Id: gplheader.pl,v 1.1 2001/11/29 18:19:27 www Exp $
        !             5: #
        !             6: # Copyright Michigan State University Board of Trustees
        !             7: #
        !             8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
        !             9: #
        !            10: # LON-CAPA is free software; you can redistribute it and/or modify
        !            11: # it under the terms of the GNU General Public License as published by
        !            12: # the Free Software Foundation; either version 2 of the License, or
        !            13: # (at your option) any later version.
        !            14: #
        !            15: # LON-CAPA is distributed in the hope that it will be useful,
        !            16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            18: # GNU General Public License for more details.
        !            19: #
        !            20: # You should have received a copy of the GNU General Public License
        !            21: # along with LON-CAPA; if not, write to the Free Software
        !            22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
        !            23: #
        !            24: # /home/httpd/html/adm/gpl.txt
        !            25: #
        !            26: # http://www.lon-capa.org/
        !            27: #
        !            28: #
1.1       www        29: # (Handler to retrieve an old version of a file
                     30: #
                     31: # (Publication Handler
                     32: # 
                     33: # (TeX Content Handler
                     34: #
                     35: # 05/29/00,05/30,10/11 Gerd Kortemeyer)
                     36: #
                     37: # 11/28,11/29,11/30,12/01,12/02,12/04,12/23 Gerd Kortemeyer
                     38: # 03/23 Guy Albertelli
                     39: # 03/24,03/29 Gerd Kortemeyer)
                     40: #
                     41: # 03/31,04/03 Gerd Kortemeyer)
                     42: #
1.5       www        43: # 05/02/01,05/09 Gerd Kortemeyer
1.1       www        44: 
                     45: package Apache::londiff;
                     46: 
                     47: use strict;
                     48: use Apache::File;
                     49: use File::Copy;
                     50: use Algorithm::Diff qw(diff);
                     51: use Apache::Constants qw(:common :http :methods);
1.5       www        52: use Apache::loncacc;
1.1       www        53: 
                     54: sub handler {
                     55: 
                     56:   my $r=shift;
                     57: 
                     58: # Get query string for limited number of parameters
                     59: 
                     60:     map {
                     61:        my ($name, $value) = split(/=/,$_);
                     62:        $value =~ tr/+/ /;
                     63:        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
                     64:        if (($name eq 'filename') || ($name eq 'versiontwo') || 
                     65:            ($name eq 'versionone')) {
                     66:            unless ($ENV{'form.'.$name}) {
                     67:               $ENV{'form.'.$name}=$value;
                     68: 	   }
                     69:        }
                     70:     } (split(/&/,$ENV{'QUERY_STRING'}));
                     71: 
                     72: # Get the files
                     73: 
1.5       www        74:   my $cuname=$ENV{'user.name'};
                     75:   my $cudom=$ENV{'user.domain'};
                     76: 
                     77:   unless (($cuname,$cudom)=
                     78:     &Apache::loncacc::constructaccess($ENV{'form.filename'},
                     79:                                       $r->dir_config('lonDefDomain'))) {
                     80:      $r->log_reason($cuname.' at '.$cudom.
                     81:          ' trying to get diffs file '.$ENV{'form.filename'}.
                     82:          '  - not authorized', 
                     83:          $r->filename); 
                     84:      return HTTP_NOT_ACCEPTABLE;
                     85:   }
                     86: 
                     87:   my $efn=$ENV{'form.filename'};
                     88: 
                     89:   $efn=~s/\/\~(\w+)//g;
                     90: 
1.1       www        91:   my @f1=();
                     92:   my @f2=();
                     93: 
1.2       www        94:   $r->content_type('text/html');
                     95:   $r->send_http_header;
                     96: 
                     97:   $r->print('<html><head><title>LON-CAPA Construction Diffs</title></head>');
                     98: 
                     99:   $r->print('<body bgcolor="#FFFFFF">');
                    100: 
                    101:   
1.5       www       102:   $r->print('<h1>Compare versions of <tt>'.$efn.'</tt></h1>');
                    103:    
                    104:        if (($cuname ne $ENV{'user.name'}) || ($cudom ne $ENV{'user.domain'})) {
                    105:           $r->print('<h3><font color=red>Co-Author: '.$cuname.' at '.$cudom.
                    106:                '</font></h3>');
                    107:       }
                    108: 
1.2       www       109: 
1.5       www       110:  if (&Apache::lonnet::fileembstyle(($efn=~/\.(\w+)$/)) eq
1.2       www       111:       'ssi') {
1.1       www       112:   if ($ENV{'form.versionone'} eq 'priv') {
1.5       www       113:       my $fn='/home/'.$cuname.'/public_html/'.$efn;
1.1       www       114:       if (-e $fn) {
                    115: 	  my $fh=Apache::File->new($fn);
                    116:           my $line;
                    117:           while($line=<$fh>) {
                    118:              chomp($line);
                    119:              $f1[$#f1+1]=$line;
                    120: 	 }
                    121:       }
1.4       www       122:       $r->print('<h3>Construction Space Version</h3>');
1.1       www       123:   } else {
                    124:       my $fn=
1.5       www       125:        '/home/httpd/html//res/'.$cudom.'/'.$cuname.'/';
1.1       www       126:       if ($ENV{'form.versionone'}) {
1.5       www       127:          my ($main,$suffix)=($efn=~/^(.+)\.(\w+)$/);
1.1       www       128:          $fn.=$main.'.'.$ENV{'form.versionone'}.'.'.$suffix;
1.4       www       129: 	 $r->print('<h3>Version '.$ENV{'form.versionone'}.'</h3>');
1.1       www       130:       } else {
1.5       www       131:          $fn.=$efn;
1.4       www       132: 	 $r->print('<h3>Current Version</h3>');
1.1       www       133:       }
                    134:       @f1=split(/\n/,&Apache::lonnet::getfile($fn));      
                    135:   }
                    136: 
1.4       www       137:   $r->print('versus');
1.1       www       138: 
                    139:   if ($ENV{'form.versiontwo'} eq 'priv') {
1.5       www       140:       my $fn='/home/'.$cuname.'/public_html/'.$efn;
1.1       www       141:       if (-e $fn) {
                    142: 	  my $fh=Apache::File->new($fn);
                    143:           my $line;
                    144:           while($line=<$fh>) {
                    145:              chomp($line);
                    146:              $f2[$#f2+1]=$line;
                    147: 	 }
                    148:       }
1.4       www       149:       $r->print('<h3>Construction Space Version</h3>');
1.1       www       150:   } else {
                    151:       my $fn=
1.5       www       152:        '/home/httpd/html/res/'.$cudom.'/'.$cuname.'/';
1.1       www       153:       if ($ENV{'form.versiontwo'}) {
1.5       www       154:          my ($main,$suffix)=($efn=~/^(.+)\.(\w+)$/);
1.1       www       155:          $fn.=$main.'.'.$ENV{'form.versiontwo'}.'.'.$suffix;
1.4       www       156: 	 $r->print('<h3>Version '.$ENV{'form.versiontwo'}.'</h3>');
1.1       www       157:       } else {
1.5       www       158:          $fn.=$efn;
1.4       www       159: 	 $r->print('<h3>Current Version</h3>');
1.1       www       160:       }
                    161:       @f2=split(/\n/,&Apache::lonnet::getfile($fn));      
                    162:   }
                    163: 
                    164: # Run diff
                    165: 
                    166:   my $diffs = diff(\@f1, \@f2);
                    167: 
                    168: # Start page output
                    169: 
                    170:   my $chunk;
                    171:   my $line;
                    172: 
1.3       www       173:   $r->print('<pre>');
                    174: 
1.1       www       175:   foreach $chunk (@$diffs) {
1.3       www       176: 
1.1       www       177:     foreach $line (@$chunk) {
                    178:       my ($sign, $lineno, $text) = @$line;
                    179:       $text=~s/\</\&lt\;/g;
                    180:       $text=~s/\>/\&gt\;/g;
1.3       www       181:       $lineno=substr($lineno.'        ',0,7);
                    182:       $r->print('<font color='.(($sign eq '+')?'green':'red').'>'.
                    183:                 $sign.' '.$lineno.' '.$text."</font>\n");
1.1       www       184:     }
1.3       www       185:     $r->print("<hr>\n");
1.1       www       186:   }
1.3       www       187:   $r->print('</pre>');
1.1       www       188: 
1.2       www       189: } else {
                    190:     $r->print('<h1><font color=red>Binary File</font></h1>');
                    191: }
1.1       www       192:   $r->print('</body></html>');
                    193:   return OK;  
                    194: }
                    195: 
                    196: 
                    197: 1;
                    198: __END__
1.2       www       199: 
1.1       www       200: 
                    201: 
                    202: 

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