package CGI::Kwiki::Plugin::Diff; $VERSION = '0.18'; use strict; use CGI qw(start_form end_form popup_menu hidden); use base 'CGI::Kwiki::Plugin'; sub process { my ($self) = @_; my $page_id = $self->cgi->page_id; my $diff = $self->diff($page_id); my $entry_form = $self->entry_form($page_id); $self->template->process( [qw(display_header display_body basic_footer)], display => "$entry_form$diff", is_diff => 1, ); } sub methods { qw(entry_form display_diff); } sub entry_form { my ($self, $page_id) = @_; $page_id ||= $self->cgi->page_id; return '' unless $self->prefs->{select_diff} && $self->backup->has_history; my $history = $self->backup->history; return '' unless @$history > 1; my $head_revision = $history->[0]{revision}; my $current_revision = $self->cgi->current_revision || $head_revision; my (@values, %labels, $selected); for (@$history) { my $key = $_->{revision}; push @values, $key; $selected = $key if $key eq $current_revision; $labels{$key} = "$_->{file_rev} ($_->{date}) $_->{edit_by}"; } my $prompt = $self->loc("Revision Diffs for %2:", ($self->script . '?' . $self->escape($page_id)), $page_id); < $prompt ${\ popup_menu( -name => 'diff_revision', -values => \@values, -default => $selected, -labels => \%labels, -onChange => "submit()", ) } FORM } sub display_diff { my ($self) = shift; return '' unless $self->prefs->{show_diff} && $self->backup->has_history; my $page_id = $self->cgi->page_id; my $history = $self->backup->history; return '' unless @$history > 1; $self->diff($page_id, $history->[1]{revision}, $history->[0]{revision}, 2, ); } sub diff { my ($self, $page_id, $r1, $r2, $context) = @_; $r1 ||= $self->cgi->diff_revision; $r2 ||= $self->cgi->current_revision; (my $num1 = $r1) =~ s/.*\.//; (my $num2 = $r2) =~ s/.*\.//; if ($num1 > $num2) { ($r1, $r2) = ($r2, $r1); } return $self->loc('No history') unless $self->backup->has_history; my $diff = $self->backup->diff($page_id, $r1, $r2, $context); $diff = CGI->escapeHTML($diff); $diff =~ s/\r//g; $diff =~ s/^\-(.*)$/$1<\/del>/mg; $diff =~ s/^\+(.*)$/$1<\/ins>/mg; $diff =~ s/\n/
\n/g; $self->decode($diff); $self->cgi->current_revision($r1); my $prompt = $self->loc("Differences from revision %1 to %2:", $self->backup->file_rev($page_id, $r1), $self->backup->file_rev($page_id, $r2)); return <$prompt
$diff
END } 1; __END__ =head1 NAME CGI::Kwiki::Plugin::Diff - A Diff Plugin for CGI::Kwiki =head1 DESCRIPTION See installed kwiki pages for more information. =head1 AUTHOR Brian Ingerson =head1 COPYRIGHT Copyright (c) 2003. Brian Ingerson. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See http://www.perl.com/perl/misc/Artistic.html =cut