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'));
38 } elsif($wiki->{storage}->backup_type eq 'all'){
39 if($cgi->param('generation') eq '' && $cgi->param('diff') eq ''){
40 return $self->show_history($wiki, $pagename);
43 if($cgi->param('generation') ne ''){
44 return $self->show_diff($wiki, $pagename, '', $cgi->param('generation'));
46 return $self->show_diff($wiki, $pagename, $cgi->param('from'), $cgi->param('to'));
49 return $self->show_diff($wiki, $pagename, '', 0);
53 #==============================================================================
54 # ÍúÎò¤«¤é¥Ú¡¼¥¸¤òÉü¸µ
55 #==============================================================================
61 unless($wiki->can_modify_page($page)){
62 return $wiki->error("¹¹¿·¸¢¸Â¤¬¤¢¤ê¤Þ¤»¤ó¡£");
64 my $source = $wiki->get_backup($page,$gen);
65 $wiki->save_page($page, $source);
66 return $wiki->redirect($page);
69 #==============================================================================
71 # ¥¹¥È¥ì¡¼¥¸¤Îbackup_type=all¤Î¤È¤
72 #==============================================================================
78 $wiki->set_title("$page¤ÎÊѹ¹ÍúÎò");
79 my $buf = "<form><ul>\n";
81 my @list = $wiki->{storage}->get_backup_list($page);
84 return "ÍúÎò¤Ï¤¢¤ê¤Þ¤»¤ó¡£";
87 # editlog¥×¥é¥°¥¤¥ó¤Î¥í¥°¤«¤éÊÔ½¸¼Ô¤Î¥æ¡¼¥¶Ì¾¤ò¼èÆÀ
88 # ¡Êeditlog¤ÎÆüÉÕ¤¬¥º¥ì¤ë¤³¤È¤¬¤¢¤Ã¤¿¤Î¤Ç1ÉðÊÆâ¤Î¹¹¿·¤ÏƱ¤¸ÍúÎò¤È¤ß¤Ê¤¹¤è¤¦¤Ë¤·¤Æ¤Þ¤¹¡Ë
90 if($wiki->config('log_dir') ne "" && -e $wiki->config('log_dir')."/useredit.log"){
91 open(DATA,$wiki->config('log_dir')."/useredit.log") or die $!;
93 my($date, $time, $unixtime, $action, $subject, $id) = split(" ",$_);
94 if($subject eq $page){
96 $editlog->{substr($unixtime, 0, length($unixtime) - 4)} = 'anonymous';
98 $editlog->{substr($unixtime, 0, length($unixtime) - 4)} = $id;
105 foreach my $time (@list){
108 $buf .= "<input type=\"radio\" name=\"from\" value=\"\" checked>".
109 "<input type=\"radio\" name=\"to\" value=\"\" checked>";
111 $buf .= "<input type=\"radio\" name=\"from\" value=\"".($#list-$count+1)."\">".
112 "<input type=\"radio\" name=\"to\" value=\"".($#list-$count+1)."\">";
114 $buf .= "<a href=\"".$wiki->create_url({ action=>"DIFF",page=>$page,generation=>($#list-$count) })."\">".&Util::format_date($time).
115 "</a> <a href=\"".$wiki->create_url({ action=>"SOURCE",page=>$page,generation=>($#list-$count) })."\">¥½¡¼¥¹</a>";
117 if(defined($editlog->{substr($time, 0, length($time) - 4)})){
118 $buf .= " by ".$editlog->{substr($time, 0, length($time) - 4)};
125 "<input type=\"hidden\" name=\"page\" value=\"".Util::escapeHTML($page)."\">".
126 "<input type=\"hidden\" name=\"action\" value=\"DIFF\">".
127 "<input type=\"submit\" name=\"diff\" value=\"ÁªÂò¤·¤¿¥ê¥Ó¥¸¥ç¥ó´Ö¤Îº¹Ê¬¤òɽ¼¨\"></form>\n";
130 #==============================================================================
132 #==============================================================================
140 $wiki->set_title("$page¤ÎÊѹ¹ÅÀ");
141 my ($diff, $rollback) = $self->get_diff_html($wiki,$page, $from, $to);
143 $diff =~ s/\n/<br>/g;
147 <li>Äɲ䵤줿Éôʬ¤Ï<ins class="diff">¤³¤Î¤è¤¦¤Ë</ins>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
148 <li>ºï½ü¤µ¤ì¤¿Éôʬ¤Ï<del class="diff">¤³¤Î¤è¤¦¤Ë</del>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
150 <div class="diff">$diff</div>
153 if($wiki->can_modify_page($page) && $rollback && $wiki->get_CGI->param('diff') eq ''){
155 <form action="@{[$wiki->create_url()]}" method="POST">
156 <input type="submit" value="¤³¤Î¥Ð¡¼¥¸¥ç¥ó¤ËÌ᤹"/>
157 <input type="hidden" name="action" value="DIFF"/>
158 <input type="hidden" name="page" value="@{[Util::escapeHTML($page)]}"/>
159 <input type="hidden" name="rollback" value="@{[Util::escapeHTML($from)]}"/>
167 #==============================================================================
169 #==============================================================================
176 my $source1 = $wiki->get_page($page);
177 my $source2 = $wiki->get_backup($page, $gen);
178 my $format = $wiki->get_edit_format();
180 $source1 = $wiki->convert_from_fswiki($source1, $format);
181 $source2 = $wiki->convert_from_fswiki($source2, $format);
184 my @msg1 = split(/\n/,$source1);
185 my @msg2 = split(/\n/,$source2);
186 my $msgrefA = \@msg2;
187 my $msgrefB = \@msg1;
189 traverse_sequences($msgrefA, $msgrefB,
194 $diff_text .= "-".$msgrefA->[$a]."\n";
198 $diff_text .= "+".$msgrefB->[$b]."\n";
205 #==============================================================================
206 # º¹Ê¬Ê¸»úÎó¤òɽ¼¨ÍÑHTML¤È¤·¤Æ¼èÆÀ
207 #==============================================================================
217 $source1 = $wiki->get_backup($page, $from);
219 $source1 = $wiki->get_page($page);
221 if($wiki->config('diff_max') ne '' && $wiki->config('diff_max') > 0){
222 if(length($source1) > $wiki->config('diff_max')){
223 return ('¥Ú¡¼¥¸¥µ¥¤¥º¤¬Â礤¤¤¿¤áº¹Ê¬¤òɽ¼¨¤Ç¤¤Þ¤»¤ó¡£', 0);
229 $source2 = $wiki->get_backup($page, $to);
231 $source2 = $wiki->get_page($page);
233 if($wiki->config('diff_max') ne '' && $wiki->config('diff_max') > 0){
234 if(length($source2) > $wiki->config('diff_max')){
235 return ('¥Ú¡¼¥¸¥µ¥¤¥º¤¬Â礤¤¤¿¤áº¹Ê¬¤òɽ¼¨¤Ç¤¤Þ¤»¤ó¡£', 0);
239 my $format = $wiki->get_edit_format();
241 $source1 = $wiki->convert_from_fswiki($source1, $format);
242 $source2 = $wiki->convert_from_fswiki($source2, $format);
244 return (&_get_diff_html($source1, $source2), $source2 ne "");
247 #==============================================================================
248 # º¹Ê¬HTML¤òÀ¸À®¤¹¤ë´Ø¿ô
249 #==============================================================================
254 my @lines1 = split(/\n/,$source1);
255 my @lines2 = split(/\n/,$source2);
256 my $linesrefA = \@lines2;
257 my $linesrefB = \@lines1;
262 traverse_sequences($linesrefA, $linesrefB, {
265 if($del_buffer ne ''){
266 $diff_text .= "<del class=\"diff\">".Util::escapeHTML($del_buffer)."</del>\n";
269 $diff_text .= Util::escapeHTML($linesrefA->[$a])."\n";
273 $del_buffer .= $linesrefA->[$a]."\n";
277 if($del_buffer eq ''){
278 $diff_text .= "<ins class=\"diff\">".Util::escapeHTML($linesrefB->[$b])."</ins>\n";
281 my @msg1 = _str_jfold($linesrefB->[$b]."\n", 1);
282 my @msg2 = _str_jfold($del_buffer, 1);
283 my $msgrefA = \@msg2;
284 my $msgrefB = \@msg1;
286 traverse_sequences($msgrefA, $msgrefB, {
289 $diff_text .= Util::escapeHTML($msgrefA->[$a]);
293 $diff_text .= "<del class=\"diff\">".Util::escapeHTML($msgrefA->[$a])."</del><wbr>";
297 $diff_text .= "<ins class=\"diff\">".Util::escapeHTML($msgrefB->[$b])."</ins><wbr>";
306 if($del_buffer ne ''){
307 $diff_text .= "<del class=\"diff\">".Util::escapeHTML($del_buffer)."</del>\n";
314 #==============================================================================
315 # ʸ»úÎó¤ò»ØÄêʸ»ú¿ô¤òʬ³ä
316 #==============================================================================
318 my $str = shift; #»ØÄêʸ»úÎó
\r
319 my $byte = shift; #»ØÄê¥Ð¥¤¥È
\r
320 my $j = new Jcode($str);
\r
323 foreach my $buff ( $j->jfold($byte) ){
\r
324 push(@result, $buff);
\r
330 #==============================================================================
331 # ¥Ú¡¼¥¸É½¼¨»þ¤Î¥Õ¥Ã¥¯¥á¥½¥Ã¥É
332 # ¡Öº¹Ê¬¡×¥á¥Ë¥å¡¼¤ò͸ú¤Ë¤·¤Þ¤¹
333 #==============================================================================
337 my $cgi = $wiki->get_CGI;
338 my $page = $cgi->param("page");
339 if($wiki->{storage}->backup_type eq 'all'){
340 $wiki->add_menu("ÍúÎò",$wiki->create_url({ action=>"DIFF",page=>$page }));
342 $wiki->add_menu("º¹Ê¬",$wiki->create_url({ action=>"DIFF",page=>$page }));