#!/usr/bin/perl -wT
#
# TWiki WikiClone (see wiki.pm for $wikiversion and other info)
#
# Copyright (C) 1999 Peter Thoeny, peter@thoeny.com
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details, published at
# http://www.gnu.org/copyleft/gpl.html
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use lib ( '.' );
use lib ( '../lib' );
use TWiki;
$query= new CGI;
&main();
# =========================
sub renderCellData
{
my( $data, $topic ) = @_;
if( $data ) {
$data = &TWiki::handleCommonTags( $data, $topic );
$data = &TWiki::getRenderedVersion( $data );
if( $data =~ m/<\/?(th|td|table)/i )
{
# data has
or | , need to fix
my $bTable = ( $data =~ s/( $eTable ) {
for( $i = $eTable; $i < $bTable; $i++ ) {
$data .= " ";
}
} elsif( $bTable < $eTable ) {
for( $i = $bTable; $i < $eTable; $i++ ) {
$data = "\n$data";
}
} elsif( ( $bTable == 0 ) && ( $eTable == 0 ) ) {
$data = "\n";
}
}
}
return $data;
}
# =========================
sub renderSideBySide
{
my ( $diffstr, $left, $right ) = @_;
my $result = "";
if ( $diffstr ne "" ) {
$diffstr =~ /^([0-9]+)[0-9\,]*([adc])([0-9]+)/;
$result .= qq(| Line: $1 | Line: $3 | \n);
if ( $2 eq "c" ) {
$lcolor = $rcolor = "#99ff99";
} elsif ( $2 eq "a" ) {
$lcolor = "#cccccc";
$rcolor = "#ccccff";
} elsif ( $2 eq "d" ) {
$lcolor = "#ff9999";
$rcolor = "#cccccc";
}
$right = renderCellData( $right, $topic );
$left = renderCellData( $left, $topic );
$result .= qq(| $left | $right | \n);
}
return $result;
}
# =========================
sub renderRevisionDiff
{
my( $text, $topic, $rev2, $rev1 ) = @_;
$text =~ s/\r//go; # cut CR
my $result = "\n";
my $data = "";
my $left = "";
my $right = "";
my $diffstr = "";
my $lcolor = "";
my $rcolor = "";
$result .= "| Rev. $rev2 | Rev. $rev1 | \n";
foreach( split( /\n/, $text ) ) {
if( /^[0-9]/ ) {
$result .= renderSideBySide ( $diffstr, $left, $right );
$left = "";
$right = "";
$diffstr = $_;
} elsif ( /^ ) {
s/^< //go;
$left .= "\n$_";
} elsif ( /^>/ ) {
s/^> //go;
$right .= "\n$_";
}
}
$result .= renderSideBySide ( $diffstr, $left, $right );
$text = "$result\n<\/table>";
return $text;
}
sub getRevInfo
{
my( $web, $rev, $topic, $short ) = @_;
my( $date, $user ) = &TWiki::Store::getRevisionInfo( $web, $topic, "1.$rev", 1 );
$user = &TWiki::userToWikiName( $user );
my $revInfo = &TWiki::getRenderedVersion( "$date GMT - $user" );
if( $short ) {
# cut time
$revInfo =~ s/ \- [0-9]*\:[0-9]*(?:\sGMT)*//go;
# eliminate white space to prevent wrap around in HR table:
$revInfo =~ s/ /\ \;/go;
}
$revInfo =~ s/[\n\r]*//go;
return $revInfo;
}
sub main
{
my $thePathInfo = $query->path_info();
my $theRemoteUser = $query->remote_user();
my $theTopic = $query->param('topic');
my $theUrl = $query->url;
( $topic, $webName, $scriptUrlPath ) =
&TWiki::initialize( $thePathInfo, $theRemoteUser, $theTopic, $theUrl, $query );
my $tmpl = "", $text = "", $diff = "";
my $rev1 = $query->param( "rev1" );
my $rev2 = $query->param( "rev2" );
my $maxrev= 1;
my $i = $maxrev, $j = $maxrev;
my $revTitle1 = "", $revTitle2 = "";
my $revInfo1 = "", $revInfo2 = "";
my $isMultipleDiff = 0;
my $oldDiffURL = "";
if( ! &TWiki::Store::webExists( $webName ) ) {
my $url = &TWiki::getOopsUrl( $webName, $topic, "oopsnoweb" );
TWiki::redirect( $query, $url );
return;
}
# get view template, standard view or a view with a different skin
my $skin = $query->param( "skin" ) || &TWiki::Prefs::getPreferencesValue( "SKIN" );
$tmpl = &TWiki::Store::readTemplate( "rdiff", $skin );
my( $before, $difftmpl, $after) = split( /%REPEAT%/, $tmpl);
my $topicExists = &TWiki::Store::topicExists( $webName, $topic );
if( $topicExists ) {
$maxrev = &TWiki::Store::getRevisionNumber( $webName, $topic );
$maxrev =~ s/r?1\.//go; # cut 'r' and major
if( ! $rev1 ) { $rev1 = 0; }
if( ! $rev2 ) { $rev2 = 0; }
$rev1 =~ s/r?1\.//go; # cut 'r' and major
$rev2 =~ s/r?1\.//go; # cut 'r' and major
if( $rev1 < 1 ) { $rev1 = $maxrev; }
if( $rev1 > $maxrev ) { $rev1 = $maxrev; }
if( $rev2 < 1 ) { $rev2 = 1; }
if( $rev2 > $maxrev ) { $rev2 = $maxrev; }
$revTitle1 = "r1.$rev1";
$revInfo1 = getRevInfo( $webName, $rev1, $topic );
if( $rev1 != $rev2 ) {
$revTitle2 = "r1.$rev2";
$revInfo2 = getRevInfo( $webName, $rev2, $topic );
}
} else {
$rev1 = 1;
$rev2 = 1;
}
# format "before" part
$before =~ s/%REVTITLE1%/$revTitle1/go;
$before =~ s/%REVTITLE2%/$revTitle2/go;
$before = &TWiki::handleCommonTags( $before, $topic );
$before = &TWiki::getRenderedVersion( $before );
$before =~ s|( ?) **nop/*>\n?|$1|gois; # remove tags (PTh 06 Nov 2000)
&TWiki::writeHeader( $query );
print $before;
$oldDiffURL = "Old diff format";
$oldDiffURL = &TWiki::handleCommonTags( $oldDiffURL, $topic );
print $oldDiffURL;
# do one or more diffs
$difftmpl = &TWiki::handleCommonTags( $difftmpl, $topic );
if( $topicExists ) {
my $r1 = $rev1, $r2 = $rev2, $rInfo = "";
if( $r1 > $r2 + 1) {
$r2 = $r1 - 1;
$isMultipleDiff = 1;
}
do {
$diff = $difftmpl;
$diff =~ s/%REVTITLE1%/r1\.$r1/go;
$rInfo = getRevInfo( $webName, $r1, $topic, 1 );
$diff =~ s/%REVINFO1%/$rInfo/go;
$text = &TWiki::Store::getRevisionDiff( $webName, $topic, "1.$r2", "1.$r1" );
$text = renderRevisionDiff( $text, $topic, "1.$r2", "1.$r1" );
$diff =~ s/%TEXT%/$text/go;
$diff =~ s|( ?) **nop/*>\n?|$1|gois; # remove tags (PTh 06 Nov 2000)
print $diff;
$r1 = $r1 - 1;
$r2 = $r2 - 1;
if( $r2 < 1 ) { $r2 = 1; }
} while( ( $r1 > $rev2 ) || ( $r1 == 1 ) );
} else {
$diff = $difftmpl;
$diff =~ s/%REVTITLE1%/$revTitle1/go;
$diff =~ s/%REVTITLE2%/$revTitle2/go;
$diff =~ s/%TEXT%//go;
$diff =~ s|( ?) **nop/*>\n?|$1|gois; # remove tags (PTh 06 Nov 2000)
print $diff;
}
if( $TWiki::doLogTopicRdiff ) {
# write log entry
&TWiki::Store::writeLog( "rdiff", "$webName.$topic", "r1.$rev1 r1.$rev2" );
}
# format "after" part
$i = $maxrev;
$j = $maxrev;
my $revisions = "";
my $breakRev = 0;
if( ( $TWiki::numberOfRevisions > 0 ) && ( $TWiki::numberOfRevisions < $maxrev ) ) {
$breakRev = $maxrev - $TWiki::numberOfRevisions + 1;
}
while( $i > 0 ) {
$revisions .= " | r1.$i";
if( $i != 1 ) {
if( $i == $breakRev ) {
# Now obsolete because of 'More' link
# $revisions = "$revisions | >...";
$i = 1;
} else {
if( ( $i == $rev1 ) && ( !$isMultipleDiff ) ) {
$revisions .= " | >";
} else {
$j = $i - 1;
$revisions .= " | >";
}
}
}
$i = $i - 1;
}
$after =~ s/%REVISIONS%/$revisions/go;
$after =~ s/%CURRREV%/1.$rev1/go;
$after =~ s/%MAXREV%/1.$maxrev/go;
$after =~ s/%REVTITLE1%/$revTitle1/go;
$after =~ s/%REVINFO1%/$revInfo1/go;
$after =~ s/%REVTITLE2%/$revTitle2/go;
$after =~ s/%REVINFO2%/$revInfo2/go;
$after = &TWiki::handleCommonTags( $after, $topic );
$after = &TWiki::getRenderedVersion( $after );
$after =~ s|( ?) **nop/*>\n?|$1|gois; # remove tags (PTh 06 Nov 2000)
print $after;
}
|