1 ###############################################################################
3 # º¹Ê¬¤òɽ¼¨¤¹¤ë¥×¥é¥°¥¤¥ó
5 ###############################################################################
6 package plugin::core::Diff;
7 use Algorithm::Diff qw(traverse_sequences);
10 #==============================================================================
12 #==============================================================================
17 return bless $self,$class;
20 #==============================================================================
22 #==============================================================================
26 my $cgi = $wiki->get_CGI;
28 my $pagename = $cgi->param("page");
30 $pagename = $wiki->config("frontpage");
32 unless($wiki->can_show($pagename)){
33 return $wiki->error("»²¾È¸¢¸Â¤¬¤¢¤ê¤Þ¤»¤ó¡£");
35 if($cgi->param('rollback') ne ''){
36 return $self->rollback($wiki, $pagename, $cgi->param('rollback'));
37 } elsif($wiki->{storage}->backup_type eq 'all'){
38 if($cgi->param('generation') eq '' && $cgi->param('diff') eq ''){
39 return $self->show_history($wiki, $pagename);
41 if($cgi->param('generation') ne ''){
42 return $self->show_diff($wiki, $pagename, '', $cgi->param('generation'));
44 return $self->show_diff($wiki, $pagename, $cgi->param('from'), $cgi->param('to'));
47 return $self->show_diff($wiki, $pagename, 0);
51 #==============================================================================
52 # ÍúÎò¤«¤é¥Ú¡¼¥¸¤òÉü¸µ
53 #==============================================================================
59 unless($wiki->can_modify_page($page)){
60 return $wiki->error("¹¹¿·¸¢¸Â¤¬¤¢¤ê¤Þ¤»¤ó¡£");
62 my $source = $wiki->get_backup($page,$gen);
63 $wiki->save_page($page, $source);
64 return $wiki->redirect($page);
67 #==============================================================================
69 # ¥¹¥È¥ì¡¼¥¸¤Îbackup_type=all¤Î¤È¤
70 #==============================================================================
76 $wiki->set_title($pagename."¤ÎÊѹ¹ÍúÎò");
77 my $buf = "<form><ul>\n";
79 my @list = $wiki->{storage}->get_backup_list($pagename);
80 foreach my $time (@list){
81 $buf .= "<li>Rev.".($#list-$count + 1);
83 $buf .= "<input type=\"radio\" name=\"from\" value=\"\">".
84 "<input type=\"radio\" name=\"to\" value=\"\">";
86 $buf .= "<input type=\"radio\" name=\"from\" value=\"".($#list-$count)."\">".
87 "<input type=\"radio\" name=\"to\" value=\"".($#list-$count)."\">";
89 $buf .= "<a href=\"".$wiki->create_url({ action=>"DIFF",page=>$pagename,generation=>($#list-$count) })."\">".&Util::escapeHTML($time).
90 "</a>¡¡<a href=\"".$wiki->create_url({ action=>"SOURCE",page=>$pagename,generation=>($#list-$count) })."\">¥½¡¼¥¹</a>".
95 "<input type=\"hidden\" name=\"page\" value=\"".Util::escapeHTML($pagename)."\">".
96 "<input type=\"hidden\" name=\"action\" value=\"DIFF\">".
97 "<input type=\"submit\" name=\"diff\" value=\"ÁªÂò¤·¤¿¥ê¥Ó¥¸¥ç¥ó´Ö¤Îº¹Ê¬¤òɽ¼¨\"></form>\n";
100 #==============================================================================
102 #==============================================================================
106 my $pagename = shift;
110 $wiki->set_title($pagename."¤ÎÊѹ¹ÅÀ");
111 my ($diff, $rollback) = $self->get_diff_html($wiki,$pagename, $from, $to);
115 <li>Äɲ䵤줿¹Ô¤Ï<ins class="diff">¤³¤Î¤è¤¦¤Ë</ins>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
116 <li>ºï½ü¤µ¤ì¤¿¹Ô¤Ï<del class="diff">¤³¤Î¤è¤¦¤Ë</del>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
121 if($wiki->can_modify_page($pagename) && $rollback && $wiki->get_CGI->param('diff') eq ''){
123 <form action="@{[$wiki->create_url()]}" method="POST">
124 <input type="submit" value="¤³¤Î¥Ð¡¼¥¸¥ç¥ó¤ËÌ᤹"/>
125 <input type="hidden" name="action" value="DIFF"/>
126 <input type="hidden" name="page" value="@{[Util::escapeHTML($pagename)]}"/>
127 <input type="hidden" name="rollback" value="@{[Util::escapeHTML($from)]}"/>
135 #==============================================================================
137 #==============================================================================
141 my $pagename = shift;
142 my $generation = shift;
144 my $source1 = $wiki->get_page($pagename);
145 my $source2 = $wiki->get_backup($pagename,$generation);
146 my $format = $wiki->get_edit_format();
148 $source1 = $wiki->convert_from_fswiki($source1,$format);
149 $source2 = $wiki->convert_from_fswiki($source2,$format);
152 my @msg1 = split(/\n/,$source1);
153 my @msg2 = split(/\n/,$source2);
154 my $msgrefA = \@msg2;
155 my $msgrefB = \@msg1;
157 traverse_sequences($msgrefA, $msgrefB,
162 $diff_text .= "-".$msgrefA->[$a]."\n";
166 $diff_text .= "+".$msgrefB->[$b]."\n";
173 #==============================================================================
174 # º¹Ê¬Ê¸»úÎó¤òɽ¼¨ÍÑHTML¤È¤·¤Æ¼èÆÀ
175 #==============================================================================
179 my $pagename = shift;
185 $source1 = $wiki->get_backup($pagename, $from);
187 $source1 = $wiki->get_page($pagename);
191 $source2 = $wiki->get_backup($pagename, $to);
193 $source2 = $wiki->get_page($pagename);
195 my $format = $wiki->get_edit_format();
197 $source1 = $wiki->convert_from_fswiki($source1, $format);
198 $source2 = $wiki->convert_from_fswiki($source2, $format);
201 my @msg1 = split(/\n/,$source1);
202 return "¥Ú¡¼¥¸¤¬Â礤¹¤®¤ë¤¿¤áº¹Ê¬¤òɽ¼¨¤Ç¤¤Þ¤»¤ó¡£" if($#msg1 >= 999);
203 my @msg2 = split(/\n/,$source2);
204 return "¥Ú¡¼¥¸¤¬Â礤¹¤®¤ë¤¿¤áº¹Ê¬¤òɽ¼¨¤Ç¤¤Þ¤»¤ó¡£" if($#msg2 >= 999);
205 my $msgrefA = \@msg2;
206 my $msgrefB = \@msg1;
208 traverse_sequences($msgrefA, $msgrefB,
212 $diff_text .= Util::escapeHTML($msgrefA->[$a])."\n";
216 $diff_text .= "<del class=\"diff\">".Util::escapeHTML($msgrefA->[$a])."</del>\n";
220 $diff_text .= "<ins class=\"diff\">".Util::escapeHTML($msgrefB->[$b])."</ins>\n";
224 return ($diff_text, $source2 ne "");
227 #==============================================================================
228 # ¥Ú¡¼¥¸É½¼¨»þ¤Î¥Õ¥Ã¥¯¥á¥½¥Ã¥É
229 # ¡Öº¹Ê¬¡×¥á¥Ë¥å¡¼¤ò͸ú¤Ë¤·¤Þ¤¹
230 #==============================================================================
234 my $cgi = $wiki->get_CGI;
236 my $pagename = $cgi->param("page");
237 $wiki->add_menu("º¹Ê¬",$wiki->create_url({ action=>"DIFF",page=>$pagename }));