OSDN Git Service

履歴を保存する設定の場合、任意のリビジョン間の差分を表示できるようにした。
authortakezoe <takezoe@users.osdn.me>
Fri, 1 Jul 2011 03:33:06 +0000 (03:33 +0000)
committertakezoe <takezoe@users.osdn.me>
Fri, 1 Jul 2011 03:33:06 +0000 (03:33 +0000)
plugin/core/Diff.pm

index e0df959..8c00c4b 100644 (file)
@@ -34,14 +34,17 @@ sub do_action {
        }
        if($cgi->param('rollback') ne ''){
                return $self->rollback($wiki, $pagename, $cgi->param('rollback'));
-       } elsif($wiki->{storage}->backup_type eq "all"){
-               if($cgi->param("generation") eq ""){
-                       return $self->show_history($wiki,$pagename);
+       } elsif($wiki->{storage}->backup_type eq 'all'){
+               if($cgi->param('generation') eq '' && $cgi->param('diff') eq ''){
+                       return $self->show_history($wiki, $pagename);
                } else {
-                       return $self->show_diff($wiki,$pagename,$cgi->param("generation"));
+                       if($cgi->param('generation') ne ''){
+                               return $self->show_diff($wiki, $pagename, '', $cgi->param('generation'));
+                       }
+                       return $self->show_diff($wiki, $pagename, $cgi->param('from'), $cgi->param('to'));
                }
        } else {
-               return $self->show_diff($wiki,$pagename,0);
+               return $self->show_diff($wiki, $pagename, 0);
        }
 }
 
@@ -71,29 +74,41 @@ sub show_history {
        my $pagename = shift;
        
        $wiki->set_title($pagename."¤ÎÊѹ¹ÍúÎò");
-       my $buf   = "<ul>\n";
+       my $buf   = "<form><ul>\n";
        my $count = 0;
        my @list  = $wiki->{storage}->get_backup_list($pagename);
        foreach my $time (@list){
-               $buf .= "<li><a href=\"".$wiki->create_url({ action=>"DIFF",page=>$pagename,generation=>($#list-$count) })."\">".&Util::escapeHTML($time).
+               $buf .= "<li>Rev.".($#list-$count + 1);
+               if($count == 0){
+                       $buf .= "<input type=\"radio\" name=\"from\" value=\"\">".
+                               "<input type=\"radio\" name=\"to\" value=\"\">";
+               } else {
+                       $buf .= "<input type=\"radio\" name=\"from\" value=\"".($#list-$count)."\">".
+                               "<input type=\"radio\" name=\"to\" value=\"".($#list-$count)."\">";
+               }
+               $buf .= "<a href=\"".$wiki->create_url({ action=>"DIFF",page=>$pagename,generation=>($#list-$count) })."\">".&Util::escapeHTML($time).
                        "</a>¡¡<a href=\"".$wiki->create_url({ action=>"SOURCE",page=>$pagename,generation=>($#list-$count) })."\">¥½¡¼¥¹</a>".
                        "</li>\n";
                $count++;
        }
-       return $buf."</ul>\n";
+       return $buf."</ul>".
+       "<input type=\"hidden\" name=\"page\" value=\"".Util::escapeHTML($pagename)."\">".
+       "<input type=\"hidden\" name=\"action\" value=\"DIFF\">".
+       "<input type=\"submit\" name=\"diff\" value=\"ÁªÂò¤·¤¿¥ê¥Ó¥¸¥ç¥ó´Ö¤Îº¹Ê¬¤òɽ¼¨\"></form>\n";
 }
 
 #==============================================================================
 # º¹Ê¬¤òɽ¼¨
 #==============================================================================
 sub show_diff {
-       my $self       = shift;
-       my $wiki       = shift;
-       my $pagename   = shift;
-       my $generation = shift;
+       my $self     = shift;
+       my $wiki     = shift;
+       my $pagename = shift;
+       my $from     = shift;
+       my $to       = shift;
        
        $wiki->set_title($pagename."¤ÎÊѹ¹ÅÀ");
-       my ($diff, $rollback) = $self->get_diff_html($wiki,$pagename,$generation);
+       my ($diff, $rollback) = $self->get_diff_html($wiki,$pagename, $from, $to);
        
        my $buf = qq|
                <ul>
@@ -103,13 +118,13 @@ sub show_diff {
                <pre>$diff</pre>
        |;
        
-       if($wiki->can_modify_page($pagename) && $rollback){
+       if($wiki->can_modify_page($pagename) && $rollback && $wiki->get_CGI->param('diff') eq ''){
                $buf .= qq|
                        <form action="@{[$wiki->create_url()]}" method="POST">
                                <input type="submit" value="¤³¤Î¥Ð¡¼¥¸¥ç¥ó¤ËÌ᤹"/>
                                <input type="hidden" name="action" value="DIFF"/>
                                <input type="hidden" name="page" value="@{[Util::escapeHTML($pagename)]}"/>
-                               <input type="hidden" name="rollback" value="@{[Util::escapeHTML($generation)]}"/>
+                               <input type="hidden" name="rollback" value="@{[Util::escapeHTML($from)]}"/>
                        </form>
                |;
        }
@@ -159,17 +174,28 @@ sub get_diff_text {
 # º¹Ê¬Ê¸»úÎó¤òɽ¼¨ÍÑHTML¤È¤·¤Æ¼èÆÀ
 #==============================================================================
 sub get_diff_html {
-       my $self       = shift;
-       my $wiki       = shift;
-       my $pagename   = shift;
-       my $generation = shift;
+       my $self     = shift;
+       my $wiki     = shift;
+       my $pagename = shift;
+       my $from     = shift;
+       my $to       = shift;
        
-       my $source1 = $wiki->get_page($pagename);
-       my $source2 = $wiki->get_backup($pagename,$generation);
+       my $source1 = '';
+       if($from ne ''){
+               $source1 = $wiki->get_backup($pagename, $from);
+       } else {
+               $source1 = $wiki->get_page($pagename);
+       }
+       my $source2 = '';
+       if($to ne ''){
+               $source2 = $wiki->get_backup($pagename, $to);
+       } else {
+               $source2 = $wiki->get_page($pagename);
+       }
        my $format  = $wiki->get_edit_format();
        
-       $source1 = $wiki->convert_from_fswiki($source1,$format);
-       $source2 = $wiki->convert_from_fswiki($source2,$format);
+       $source1 = $wiki->convert_from_fswiki($source1, $format);
+       $source2 = $wiki->convert_from_fswiki($source2, $format);
        
        my $diff_text = "";
        my @msg1 = split(/\n/,$source1);