OSDN Git Service

文字単位で差分を表示できるようにした。
authortakezoe <takezoe@users.osdn.me>
Sat, 2 Jul 2011 01:59:44 +0000 (01:59 +0000)
committertakezoe <takezoe@users.osdn.me>
Sat, 2 Jul 2011 01:59:44 +0000 (01:59 +0000)
plugin/core/Diff.pm

index 8c00c4b..e9f0190 100644 (file)
@@ -77,14 +77,19 @@ sub show_history {
        my $buf   = "<form><ul>\n";
        my $count = 0;
        my @list  = $wiki->{storage}->get_backup_list($pagename);
+       
+       if($#list == -1){
+               return "ÍúÎò¤Ï¤¢¤ê¤Þ¤»¤ó¡£";
+       }
+       
        foreach my $time (@list){
-               $buf .= "<li>Rev.".($#list-$count + 1);
+               $buf .= "<li>";
                if($count == 0){
-                       $buf .= "<input type=\"radio\" name=\"from\" value=\"\">".
-                               "<input type=\"radio\" name=\"to\" value=\"\">";
+                       $buf .= "<input type=\"radio\" name=\"from\" value=\"\" checked>".
+                               "<input type=\"radio\" name=\"to\" value=\"\" checked>";
                } else {
-                       $buf .= "<input type=\"radio\" name=\"from\" value=\"".($#list-$count)."\">".
-                               "<input type=\"radio\" name=\"to\" value=\"".($#list-$count)."\">";
+                       $buf .= "<input type=\"radio\" name=\"from\" value=\"".($#list-$count+1)."\">".
+                               "<input type=\"radio\" name=\"to\" value=\"".($#list-$count+1)."\">";
                }
                $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>".
@@ -110,12 +115,14 @@ sub show_diff {
        $wiki->set_title($pagename."¤ÎÊѹ¹ÅÀ");
        my ($diff, $rollback) = $self->get_diff_html($wiki,$pagename, $from, $to);
        
+       $diff =~ s/\n/<br>/g;
+       
        my $buf = qq|
                <ul>
                  <li>Äɲ䵤줿¹Ô¤Ï<ins class="diff">¤³¤Î¤è¤¦¤Ë</ins>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
                  <li>ºï½ü¤µ¤ì¤¿¹Ô¤Ï<del class="diff">¤³¤Î¤è¤¦¤Ë</del>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
                </ul>
-               <pre>$diff</pre>
+               <div class="diff">$diff</div>
        |;
        
        if($wiki->can_modify_page($pagename) && $rollback && $wiki->get_CGI->param('diff') eq ''){
@@ -198,10 +205,15 @@ sub get_diff_html {
        $source2 = $wiki->convert_from_fswiki($source2, $format);
        
        my $diff_text = "";
+=pod
        my @msg1 = split(/\n/,$source1);
        return "¥Ú¡¼¥¸¤¬Â礭¤¹¤®¤ë¤¿¤áº¹Ê¬¤òɽ¼¨¤Ç¤­¤Þ¤»¤ó¡£" if($#msg1 >= 999);
        my @msg2 = split(/\n/,$source2);
        return "¥Ú¡¼¥¸¤¬Â礭¤¹¤®¤ë¤¿¤áº¹Ê¬¤òɽ¼¨¤Ç¤­¤Þ¤»¤ó¡£" if($#msg2 >= 999);
+=cut
+       my @msg1 = _str_jfold($source1, 1);
+       my @msg2 = _str_jfold($source2, 1);
+       
        my $msgrefA = \@msg2;
        my $msgrefB = \@msg1;
        
@@ -209,15 +221,15 @@ sub get_diff_html {
                {
                        MATCH => sub {
                                my ($a, $b) = @_;
-                               $diff_text .= Util::escapeHTML($msgrefA->[$a])."\n";
+                               $diff_text .= Util::escapeHTML($msgrefA->[$a]);
                        },
                        DISCARD_A => sub {
                                my ($a, $b) = @_;
-                               $diff_text .= "<del class=\"diff\">".Util::escapeHTML($msgrefA->[$a])."</del>\n";
+                               $diff_text .= "<del class=\"diff\">".Util::escapeHTML($msgrefA->[$a])."</del><wbr>";
                        },
                        DISCARD_B => sub {
                                my ($a, $b) = @_;
-                               $diff_text .= "<ins class=\"diff\">".Util::escapeHTML($msgrefB->[$b])."</ins>\n";
+                               $diff_text .= "<ins class=\"diff\">".Util::escapeHTML($msgrefB->[$b])."</ins><wbr>";
                        }
                });
        
@@ -225,6 +237,22 @@ sub get_diff_html {
 }
 
 #==============================================================================
+# Ê¸»úÎó¤ò»ØÄêʸ»ú¿ô¤òʬ³ä
+#==============================================================================
+sub _str_jfold {\r
+  my $str    = shift;       #»ØÄêʸ»úÎó\r
+  my $byte   = shift;       #»ØÄê¥Ð¥¤¥È\r
+  my $j      = new Jcode($str);\r
+  my @result = ();\r
+\r
+  foreach my $buff ( $j->jfold($byte) ){\r
+    push(@result, $buff);\r
+  }\r
+\r
+  return(@result);\r
+}
+
+#==============================================================================
 # ¥Ú¡¼¥¸É½¼¨»þ¤Î¥Õ¥Ã¥¯¥á¥½¥Ã¥É
 # ¡Öº¹Ê¬¡×¥á¥Ë¥å¡¼¤òÍ­¸ú¤Ë¤·¤Þ¤¹
 #==============================================================================