[Home]PerlDiff

UseModWiki | RecentChanges | Preferences

Description

This is the same mod as WikiPatches/PerlDiff, but I have turned it into a patchable install. --MarkButler


Comments

I've fixed a few HTML entities in the diff output. Renaming is fine with me. :-) --MichaelBuschbeck

You are a star! Thanks heaps. --MarkButler

Sorry I have trashed them again. The issue is that I am adding the diff output directly into this page. So to get the right text you need to copy from the Edit this Page window.


Note that you still need to add some stuff to your stylesheet - e.g.:

 .diff-para-ident   { background: #ccddee }
 .diff-para-changed { background: #ccddee }
 .diff-para-added , .diff-span-added     { background: #a2d9c7 }
 .diff-para-deleted , .diff-span-deleted { background: #c7b9cc }

You'll also have to follow the instructions at WikiPatches/PerlDiff for running wiki-update-diff.cgi ...DougConley


The Mod

--- wiki.1.0.0.pl	Thu Sep 12 10:53:14 2002
+++ wikipatch.PerlDiff.pl	Thu Jan 15 22:19:54 2004
@@ -26,6 +26,7 @@
 #    59 Temple Place, Suite 330
 #    Boston, MA 02111-1307 USA
 
+use Diff;
 package UseModWiki;
 use strict;
 local $| = 1;  # Do not buffer output (localized for mod_perl)
@@ -2253,72 +2254,51 @@
 }
 
 sub GetDiff {
-  my ($old, $new, $lock) = @_;
-  my ($diff_out, $oldName, $newName);
-
-  &CreateDir($TempDir);
-  $oldName = "$TempDir/old_diff";
-  $newName = "$TempDir/new_diff";
-  if ($lock) {
-    &RequestDiffLock() or return "";
-    $oldName .= "_locked";
-    $newName .= "_locked";
-  }
-  &WriteStringToFile($oldName, $old);
-  &WriteStringToFile($newName, $new);
-  $diff_out = `diff $oldName $newName`;
-  &ReleaseDiffLock()  if ($lock);
-  $diff_out =~ s/\\ No newline.*\n//g;   # Get rid of common complaint.
-  # No need to unlink temp files--next diff will just overwrite.
-  return $diff_out;
+  my $textOld = shift;
+  my $textNew = shift;
+  my %format = (
+    paraIdent     => '<tr valign=top><td class="diff-para-ident"><p>%text%</p></td><td></td><td class="diff-para-ident"><p>%text%</p></td></tr>',
+    paraAdded     => '<tr valign=top><td class="diff-para-ident"></td><td></td><td class="diff-para-added"><p>%text%</p></td></tr>',
+    paraDeleted   => '<tr valign=top><td class="diff-para-deleted"><p>%text%</p></td><td></td><td class="diff-para-ident"></td></tr>',
+    paraChanged   => '<tr valign=top><td class="diff-para-changed-old"><p>%text%</p></td><td></td><td class="diff-para-changed-new"><p>%text%</p></td></tr>',
+    paraReplaced  => '<tr valign=top><td class="diff-para-deleted"><p>%textDeleted%</p></td><td></td><td class="diff-para-added"><p>%textAdded%</p></td></tr>',
+    changeContext => 1,
+    changeHeader  => '<tr valign=top><td class="diff-header" width="48%">Paragraph %oldFrom%</td><td width="4%"></td><td class="diff-header" width="48%">Paragraph %newFrom%</td></tr>',
+    spanIdent     => '<span class="diff-span-ident">%text%</span>',
+    spanAdded     => '<span class="diff-span-added">%text%</span>',
+    spanDeleted   => '<span class="diff-span-deleted">%text%</span>',
+    processText => sub {
+      my $text = shift;
+      $text =~ s[&]               [&]g;
+      $text =~ s[<]               [<]g;
+      $text =~ s[>]               [>]g;
+      $text =~ s[\n]              [<br>\n]g;
+      $text =~ s[\r]              []g;
+      $text =~ s[([\t ]+)([\t ])] [(' ' x length($1)) . $2]ge;
+      $text =~ s[^[\t ]]          [ ];
+      return $text;
+    }
+  );
+  my $diff = Diff::diffText($textOld, $textNew, %format);
+  if ($diff ne '') {
+    $diff =~ s[<td class="diff-para-changed-old">(.*?)</td>] [
+      my $textChanged = $1;
+      $textChanged =~ s[<span class="diff-span-added">.*?</span>] []gs;
+      qq[<td class="diff-para-changed">$textChanged</td>];
+    ]ges;
+    $diff =~ s[<td class="diff-para-changed-new">(.*?)</td>] [
+      my $textChanged = $1;
+      $textChanged =~ s[<span class="diff-span-deleted">.*?</span>] []gs;
+      qq[<td class="diff-para-changed">$textChanged</td>];
+    ]ges;
+    $diff = qq[<table width="100%" border=0 cellspacing=0 cellpadding=0>$diff</table>];
+  }
+  return $diff;
 }
 
 sub DiffToHTML {
-  my ($html) = @_;
-  my ($tChanged, $tRemoved, $tAdded);
-
-  $tChanged = T('Changed:');
-  $tRemoved = T('Removed:');
-  $tAdded   = T('Added:');
-  $html =~ s/\n--+//g;
-  # Note: Need spaces before <br> to be different from diff section.
-  $html =~ s/(^|\n)(\d+.*c.*)/$1 <br><strong>$tChanged $2<\/strong><br>/g;
-  $html =~ s/(^|\n)(\d+.*d.*)/$1 <br><strong>$tRemoved $2<\/strong><br>/g;
-  $html =~ s/(^|\n)(\d+.*a.*)/$1 <br><strong>$tAdded $2<\/strong><br>/g;
-  $html =~ s/\n((<.*\n)+)/&ColorDiff($1, $DiffColor1, 0)/ge;
-  $html =~ s/\n((>.*\n)+)/&ColorDiff($1, $DiffColor2, 1)/ge;
-  return $html;
-}
-
-sub ColorDiff {
-  my ($diff, $color, $type) = @_;
-  my ($colorHtml, $classHtml);
-
-  $diff =~ s/(^|\n)[<>]/$1/g;
-  $diff = &QuoteHtml($diff);
-  # Do some of the Wiki markup rules:
-  %SaveUrl = ();
-  %SaveNumUrl = ();
-  $SaveUrlIndex = 0;
-  $SaveNumUrlIndex = 0;
-  $diff = &RemoveFS($diff);
-  $diff = &CommonMarkup($diff, 0, 1);      # No images, all patterns
-  if ($LateRules ne '') {
-    $diff = &EvalLocalRules($LateRules, $diff, 1);
-  }
-  1 while $diff =~ s/$FS(\d+)$FS/$SaveUrl{$1}/ge;   # Restore saved text
-  $diff =~ s/\r?\n/<br>/g;
-  $colorHtml = '';
-  if ($color ne '') {
-    $colorHtml = " bgcolor=$color";
-  }
-  if ($type) {
-    $classHtml = ' class=wikidiffnew';
-  } else {
-    $classHtml = ' class=wikidiffold';
-  }
-  return "<table width=\"95\%\"$colorHtml$classHtml><tr><td>\n" . $diff
-         . "</td></tr></table>\n";
+	shift
+	#This is the place where you could take care of per-user options. 
 }
 
 # ==== Database (Page, Section, Text, Kept, User) functions ====
@@ -4013,6 +3993,7 @@
   $oldMajor  = &GetPageCache('oldmajor');
   $oldAuthor = &GetPageCache('oldauthor');
   if ($UseDiffLog) {
+	my $editDiff = Diff::diffClassic($old, $new);
     &WriteDiff($id, $editTime, $editDiff);
   }
   &SetPageCache('diff_default_minor', $editDiff);

UseModWiki | RecentChanges | Preferences
Edit text of this page | View other revisions | Search MetaWiki
Last edited October 8, 2006 5:21 pm by MarkusLude (diff)
Search: