OSDN Git Service

コンフリクト時に差分を表示するようにした。
[fswiki/fswiki.git] / plugin / core / EditPage.pm
index 89bb257..381d783 100644 (file)
-###############################################################################\r
-# \r
-# ¥Ú¡¼¥¸¤òÊÔ½¸¤¹¤ë¥×¥é¥°¥¤¥ó\r
-# \r
-###############################################################################\r
-package plugin::core::EditPage;\r
-use strict;\r
-#==============================================================================\r
-# ¥³¥ó¥¹¥È¥é¥¯¥¿\r
-#==============================================================================\r
-sub new {\r
-       my $class = shift;\r
-       my $self = {};\r
-       return bless $self,$class;\r
-}\r
-\r
-#==============================================================================\r
-# ¥¢¥¯¥·¥ç¥ó¤Î¼Â¹Ô\r
-#==============================================================================\r
-sub do_action {\r
-       my $self = shift;\r
-       my $wiki = shift;\r
-       my $cgi = $wiki->get_CGI;\r
-       \r
-       my $pagename = $cgi->param("page");\r
-       my $format   = $wiki->get_edit_format();\r
-       my $content  = $cgi->param("content");\r
-       my $sage     = $cgi->param("sage");\r
-       my $template = $cgi->param("template");\r
-       my $artno    = $cgi->param("artno");\r
-       my $time     = $wiki->get_last_modified($pagename);\r
-       \r
-       my $buf = "";\r
-       my $login = $wiki->get_login_info();\r
-\r
-       if($pagename eq ""){\r
-               return $wiki->error("¥Ú¡¼¥¸¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");\r
-       }\r
-       if($pagename =~ /([\|\[\]])|^:|([^:]:[^:])/){\r
-               return $wiki->error("¥Ú¡¼¥¸Ì¾¤Ë»ÈÍѤǤ­¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£");\r
-       }\r
-       if(!$wiki->can_modify_page($pagename)){\r
-               return $wiki->error("¥Ú¡¼¥¸¤ÎÊÔ½¸¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");\r
-       }\r
-       \r
-       #--------------------------------------------------------------------------\r
-       # Êݸ½èÍý\r
-       if($cgi->param("save") ne ""){\r
-               if($wiki->page_exists($pagename)){\r
-                       if($cgi->param("lastmodified") != $time){\r
-                               return $wiki->error("¥Ú¡¼¥¸¤Ï´û¤ËÊ̤Υ桼¥¶¤Ë¤è¤Ã¤Æ¹¹¿·¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");\r
-                       }\r
-               }\r
-               #my $save_content = $content;\r
-               my $mode = $wiki->get_edit_format();\r
-               my $save_content = $wiki->convert_to_fswiki($content,$mode);\r
-\r
-               # ¥Ñ¡¼¥ÈÊÔ½¸¤Î¾ì¹ç\r
-               if($artno ne ""){\r
-                       $save_content = &make_save_source($wiki->get_page($pagename),$save_content,$artno,$wiki);\r
-               }\r
-               # FrontPage¤Ïºï½üÉÔ²Ä\r
-               if($pagename eq $wiki->config("frontpage") && $save_content eq ""){\r
-                       $buf = "<b>".&Util::escapeHTML($wiki->config("frontpage"))."¤Ïºï½ü¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£</b>\n";\r
-\r
-               # ¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï½èÍý¤ò¼Â¹Ô¤·¤Æ¥á¥Ã¥»¡¼¥¸¤òÊÖµÑ\r
-               } else {\r
-                       $wiki->save_page($pagename,$save_content,$sage);\r
-                       \r
-                       if($content ne ""){\r
-                               $wiki->redirect($pagename);\r
-                       } else {\r
-                               if($artno eq ""){\r
-                                       $wiki->set_title($pagename."¤òºï½ü¤·¤Þ¤·¤¿");\r
-                                       return Util::escapeHTML($pagename)."¤òºï½ü¤·¤Þ¤·¤¿¡£";\r
-                               } else {\r
-                                       $wiki->set_title($pagename."¤Î¥Ñ¡¼¥È¤òºï½ü¤·¤Þ¤·¤¿");\r
-                                       return Util::escapeHTML($pagename)."¤Î¥Ñ¡¼¥È¤òºï½ü¤·¤Þ¤·¤¿¡£";\r
-                               }\r
-                       }\r
-               }\r
-       #--------------------------------------------------------------------------\r
-       # ¥×¥ì¥Ó¥å¡¼½èÍý\r
-       } elsif($cgi->param("preview") ne ""){\r
-               $time = $cgi->param("lastmodified");\r
-               $buf = "°Ê²¼¤Î¥×¥ì¥Ó¥å¡¼¤ò³Îǧ¤·¤Æ¤è¤í¤·¤±¤ì¤Ð¡ÖÊݸ¡×¥Ü¥¿¥ó¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤¡£<br>";\r
-               if($content eq ""){\r
-                       if($pagename eq $wiki->config("frontpage") && $artno eq ""){\r
-                               $buf = $buf."<b>¡Ê".&Util::escapeHTML($wiki->config("frontpage"))."¤Ïºï½ü¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¡Ë</b>";\r
-                       } else {\r
-                               if($artno eq ""){\r
-                                       $buf = $buf."<b>¡Ê¥Ú¡¼¥¸ÆâÍƤ϶õ¤Ç¤¹¡£¹¹¿·¤¹¤ë¤È¤³¤Î¥Ú¡¼¥¸¤Ïºï½ü¤µ¤ì¤Þ¤¹¡£¡Ë</b>";\r
-                               } else {\r
-                                       $buf = $buf."<b>¡Ê¥Ú¡¼¥¸ÆâÍƤ϶õ¤Ç¤¹¡£¹¹¿·¤¹¤ë¤È¤³¤Î¥Ñ¡¼¥È¤Ïºï½ü¤µ¤ì¤Þ¤¹¡£¡Ë</b>";\r
-                               }\r
-                       }\r
-               }\r
-               $content = $wiki->convert_to_fswiki($content,$format);\r
-               $buf = $buf."<br>".$wiki->process_wiki($content);\r
-\r
-       } elsif($wiki->page_exists($pagename)) {\r
-               #¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¾ì¹ç\r
-               if($artno eq ""){\r
-                       $content = $wiki->get_page($pagename);\r
-               } else {\r
-                       $content = &read_by_part($wiki->get_page($pagename),$artno);\r
-               }\r
-       } elsif($template ne ""){\r
-               #¥Æ¥ó¥×¥ì¡¼¥È¤ò»ØÄꤵ¤ì¤¿¾ì¹ç\r
-               $content = $wiki->get_page($template);\r
-       }\r
-       \r
-       #--------------------------------------------------------------------------\r
-       # ÆþÎÏ¥Õ¥©¡¼¥à\r
-       $wiki->set_title($pagename."¤ÎÊÔ½¸",1);\r
-\r
-       my $tmpl = HTML::Template->new(filename=>$wiki->config('tmpl_dir')."/editform.tmpl",\r
-                                   die_on_bad_params => 0);\r
-\r
-       $tmpl->param({SCRIPT_NAME   => $wiki->create_url(),\r
-                                 PAGE_NAME     => $pagename,\r
-                                 CONTENT       => $wiki->convert_from_fswiki($content,$format),\r
-                                 LAST_MODIFIED => $time,\r
-                                 ACTION        => 'EDIT',\r
-                                 EXISTS_PAGE   => $wiki->page_exists($pagename),\r
-                                 SAGE          => $sage});\r
-       \r
-       if($artno ne ""){\r
-               $tmpl->param(OPTIONAL_PARAMS=>[{NAME=>'artno',VALUE=>$artno}]);\r
-       }\r
-\r
-       $buf .= $tmpl->output();\r
-\r
-       # ¥×¥é¥°¥¤¥ó¤òÁÞÆþ\r
-       $buf .= $wiki->get_editform_plugin();\r
-       \r
-       return $buf;\r
-}\r
-\r
-#==============================================================================\r
-# ¥Ñ¡¼¥ÈÊÔ½¸¤Î¾ì¹ç¤ÎÊÔ½¸Éôʬ¤Î¼è¤ê½Ð¤·\r
-#==============================================================================\r
-sub read_by_part {\r
-       my $page  = shift;\r
-       my $num   = shift;\r
-       my $count = 0;\r
-       my $buf   = "";\r
-       my $level = 0;\r
-       my $flag  = 0;\r
-       foreach my $line (split(/\n/,$page)){\r
-               if($line=~/^(!{1,3})/){\r
-                       if($flag==1 && $level<=length($1)){\r
-                               last;\r
-                       }\r
-                       if($count==$num){\r
-                               $flag  = 1;\r
-                               $level = length($1);\r
-                       }\r
-                       $count++;\r
-               }\r
-               if($flag==1){\r
-                       $buf .= $line."\n";\r
-               }\r
-       }\r
-       return $buf;\r
-}\r
-\r
-#==============================================================================\r
-# ¥Ñ¡¼¥ÈÊÔ½¸¤Î¾ì¹ç¤ÎÊݸÍÑ¥½¡¼¥¹¤ÎºîÀ®\r
-#==============================================================================\r
-sub make_save_source {\r
-       my $org   = shift;\r
-       my $edit  = shift;\r
-       my $num   = shift;\r
-       my $wiki  = shift;\r
-       my $count = 0;\r
-       my $buf   = "";\r
-       my $level = "";\r
-       my $flag  = "";\r
-       foreach my $line (split(/\n/,$org)){\r
-               if($line=~/^(!{1,3})/){\r
-                       if($flag==1 && $level<=length($1)){\r
-                               $flag = 0;\r
-                       }\r
-                       if($count==$num){\r
-                               $flag  = 1;\r
-                               $level = length($1);\r
-                               $buf .= $edit;\r
-                               # ºÇ¸å¤¬²þ¹Ô¤Ç¤Ê¤¤¾ì¹ç¤À¤±²þ¹Ô¤òÄɲáʼ¡¤Î¥»¥¯¥·¥ç¥ó¤È¤¯¤Ã¤Ä¤¤¤Æ¤·¤Þ¤¦¤¿¤á¡Ë\r
-                               $buf .= "\n" unless($edit =~ /\n$/);\r
-                       }\r
-                       $count++;\r
-               }\r
-               if($flag==0){\r
-                       $buf .= "$line\n";\r
-               }\r
-       }\r
-       return $buf;\r
-}\r
-\r
-#==============================================================================\r
-# ¥Ú¡¼¥¸É½¼¨»þ¤Î¥Õ¥Ã¥¯¥á¥½¥Ã¥É\r
-# ¡ÖÊÔ½¸¡×¥á¥Ë¥å¡¼¤òÍ­¸ú¤Ë¤·¤Þ¤¹\r
-#==============================================================================\r
-sub hook {\r
-       my $self = shift;\r
-       my $wiki = shift;\r
-       my $cgi  = $wiki->get_CGI;\r
-       \r
-       my $pagename = $cgi->param("page");\r
-       my $login    = $wiki->get_login_info();\r
-       \r
-       # ÊÔ½¸¥á¥Ë¥å¡¼¤ÎÀ©¸æ\r
-       if($wiki->can_modify_page($pagename)){\r
-               $wiki->add_menu("ÊÔ½¸",$wiki->create_url({ action=>"EDIT",page=>$pagename }));\r
-       }\r
-}\r
-\r
-1;\r
+###############################################################################
+# 
+# ¥Ú¡¼¥¸¤òÊÔ½¸¤¹¤ë¥×¥é¥°¥¤¥ó
+# 
+###############################################################################
+package plugin::core::EditPage;
+use strict;
+use plugin::core::Diff;
+#==============================================================================
+# ¥³¥ó¥¹¥È¥é¥¯¥¿
+#==============================================================================
+sub new {
+       my $class = shift;
+       my $self = {};
+       return bless $self,$class;
+}
+
+#==============================================================================
+# ¥¢¥¯¥·¥ç¥ó¤Î¼Â¹Ô
+#==============================================================================
+sub do_action {
+       my $self = shift;
+       my $wiki = shift;
+       my $cgi = $wiki->get_CGI;
+       
+       my $pagename = $cgi->param("page");
+       my $format   = $wiki->get_edit_format();
+       my $content  = $cgi->param("content");
+       my $sage     = $cgi->param("sage");
+       my $template = $cgi->param("template");
+       my $artno    = $cgi->param("artno");
+       my $time     = $wiki->get_last_modified($pagename);
+       
+       my $buf = "";
+       my $login = $wiki->get_login_info();
+
+       if($pagename eq ""){
+               return $wiki->error("¥Ú¡¼¥¸¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
+       }
+       if($pagename =~ /([\|\[\]])|^:|([^:]:[^:])/){
+               return $wiki->error("¥Ú¡¼¥¸Ì¾¤Ë»ÈÍѤǤ­¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£");
+       }
+       if(!$wiki->can_modify_page($pagename)){
+               return $wiki->error("¥Ú¡¼¥¸¤ÎÊÔ½¸¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
+       }
+       
+       #--------------------------------------------------------------------------
+       # Êݸ½èÍý
+       if($cgi->param("save") ne ""){
+               if($wiki->page_exists($pagename) && $cgi->param("lastmodified") != $time){
+                       $buf .= "<p><span class=\"error\">¥Ú¡¼¥¸¤Ï´û¤ËÊ̤Υ桼¥¶¤Ë¤è¤Ã¤Æ¹¹¿·¤µ¤ì¤Æ¤¤¤Þ¤¹¡£</span></p>";
+                       
+                       my $mode = $wiki->get_edit_format();
+                       my $orig_source = $wiki->convert_from_fswiki($wiki->get_page($pagename), $mode);
+                       my $your_source = $content;
+                       $your_source =~ s/\r\n/\n/g;
+                       $your_source =~ s/\r/\n/g;
+                       
+                       my $diff = plugin::core::Diff::_get_diff_html($wiki, $orig_source, $your_source);
+                       $diff =~ s/\n/<br>/g;
+                       
+                       $buf .= qq|
+                               <ul>
+                                 <li>Äɲ䵤줿Éôʬ¤Ï<ins class="diff">¤³¤Î¤è¤¦¤Ë</ins>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
+                                 <li>ºï½ü¤µ¤ì¤¿Éôʬ¤Ï<del class="diff">¤³¤Î¤è¤¦¤Ë</del>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
+                               </ul>
+                               <div class="diff">$diff</div>
+                       |;
+                       
+                       $content = $orig_source;
+                       
+               } else {
+                       #my $save_content = $content;
+                       my $mode = $wiki->get_edit_format();
+                       my $save_content = $wiki->convert_to_fswiki($content,$mode);
+
+                       # ¥Ñ¡¼¥ÈÊÔ½¸¤Î¾ì¹ç
+                       if($artno ne ""){
+                               $save_content = &make_save_source($wiki->get_page($pagename),$save_content,$artno,$wiki);
+                       }
+                       # FrontPage¤Ïºï½üÉÔ²Ä
+                       if($pagename eq $wiki->config("frontpage") && $save_content eq ""){
+                               $buf = "<b>".&Util::escapeHTML($wiki->config("frontpage"))."¤Ïºï½ü¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£</b>\n";
+
+                       # ¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï½èÍý¤ò¼Â¹Ô¤·¤Æ¥á¥Ã¥»¡¼¥¸¤òÊÖµÑ
+                       } else {
+                               $wiki->save_page($pagename,$save_content,$sage);
+                               
+                               if($content ne ""){
+                                       $wiki->redirect($pagename);
+                               } else {
+                                       if($artno eq ""){
+                                               $wiki->set_title($pagename."¤òºï½ü¤·¤Þ¤·¤¿");
+                                               return Util::escapeHTML($pagename)."¤òºï½ü¤·¤Þ¤·¤¿¡£";
+                                       } else {
+                                               $wiki->set_title($pagename."¤Î¥Ñ¡¼¥È¤òºï½ü¤·¤Þ¤·¤¿");
+                                               return Util::escapeHTML($pagename)."¤Î¥Ñ¡¼¥È¤òºï½ü¤·¤Þ¤·¤¿¡£";
+                                       }
+                               }
+                       }
+               }
+       #--------------------------------------------------------------------------
+       # ¥×¥ì¥Ó¥å¡¼½èÍý
+       } elsif($cgi->param("preview") ne ""){
+               $time = $cgi->param("lastmodified");
+               $buf = "°Ê²¼¤Î¥×¥ì¥Ó¥å¡¼¤ò³Îǧ¤·¤Æ¤è¤í¤·¤±¤ì¤Ð¡ÖÊݸ¡×¥Ü¥¿¥ó¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤¡£<br>";
+               if($content eq ""){
+                       if($pagename eq $wiki->config("frontpage") && $artno eq ""){
+                               $buf = $buf."<b>¡Ê".&Util::escapeHTML($wiki->config("frontpage"))."¤Ïºï½ü¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¡Ë</b>";
+                       } else {
+                               if($artno eq ""){
+                                       $buf = $buf."<b>¡Ê¥Ú¡¼¥¸ÆâÍƤ϶õ¤Ç¤¹¡£¹¹¿·¤¹¤ë¤È¤³¤Î¥Ú¡¼¥¸¤Ïºï½ü¤µ¤ì¤Þ¤¹¡£¡Ë</b>";
+                               } else {
+                                       $buf = $buf."<b>¡Ê¥Ú¡¼¥¸ÆâÍƤ϶õ¤Ç¤¹¡£¹¹¿·¤¹¤ë¤È¤³¤Î¥Ñ¡¼¥È¤Ïºï½ü¤µ¤ì¤Þ¤¹¡£¡Ë</b>";
+                               }
+                       }
+               }
+               $content = $wiki->convert_to_fswiki($content,$format);
+               $buf = $buf."<br>".$wiki->process_wiki($content);
+
+       } elsif($wiki->page_exists($pagename)) {
+               #¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¾ì¹ç
+               if($artno eq ""){
+                       $content = $wiki->get_page($pagename);
+               } else {
+                       $content = &read_by_part($wiki->get_page($pagename),$artno);
+               }
+       } elsif($template ne ""){
+               #¥Æ¥ó¥×¥ì¡¼¥È¤ò»ØÄꤵ¤ì¤¿¾ì¹ç
+               $content = $wiki->get_page($template);
+       }
+       
+       #--------------------------------------------------------------------------
+       # ÆþÎÏ¥Õ¥©¡¼¥à
+       $wiki->set_title($pagename."¤ÎÊÔ½¸",1);
+
+       my $tmpl = HTML::Template->new(filename=>$wiki->config('tmpl_dir')."/editform.tmpl",
+                                   die_on_bad_params => 0);
+
+       $tmpl->param({SCRIPT_NAME   => $wiki->create_url(),
+                                 PAGE_NAME     => $pagename,
+                                 CONTENT       => $wiki->convert_from_fswiki($content,$format),
+                                 LAST_MODIFIED => $time,
+                                 ACTION        => 'EDIT',
+                                 EXISTS_PAGE   => $wiki->page_exists($pagename),
+                                 SAGE          => $sage});
+       
+       if($artno ne ""){
+               $tmpl->param(OPTIONAL_PARAMS=>[{NAME=>'artno',VALUE=>$artno}]);
+       }
+
+       $buf .= $tmpl->output();
+
+       # ¥×¥é¥°¥¤¥ó¤òÁÞÆþ
+       $buf .= $wiki->get_editform_plugin();
+       
+       return $buf;
+}
+
+#==============================================================================
+# ¥Ñ¡¼¥ÈÊÔ½¸¤Î¾ì¹ç¤ÎÊÔ½¸Éôʬ¤Î¼è¤ê½Ð¤·
+#==============================================================================
+sub read_by_part {
+       my $page  = shift;
+       my $num   = shift;
+       my $count = 0;
+       my $buf   = "";
+       my $level = 0;
+       my $flag  = 0;
+       foreach my $line (split(/\n/,$page)){
+               if($line=~/^(!{1,3})/){
+                       if($flag==1 && $level<=length($1)){
+                               last;
+                       }
+                       if($count==$num){
+                               $flag  = 1;
+                               $level = length($1);
+                       }
+                       $count++;
+               }
+               if($flag==1){
+                       $buf .= $line."\n";
+               }
+       }
+       return $buf;
+}
+
+#==============================================================================
+# ¥Ñ¡¼¥ÈÊÔ½¸¤Î¾ì¹ç¤ÎÊݸÍÑ¥½¡¼¥¹¤ÎºîÀ®
+#==============================================================================
+sub make_save_source {
+       my $org   = shift;
+       my $edit  = shift;
+       my $num   = shift;
+       my $wiki  = shift;
+       my $count = 0;
+       my $buf   = "";
+       my $level = "";
+       my $flag  = "";
+       foreach my $line (split(/\n/,$org)){
+               if($line=~/^(!{1,3})/){
+                       if($flag==1 && $level<=length($1)){
+                               $flag = 0;
+                       }
+                       if($count==$num){
+                               $flag  = 1;
+                               $level = length($1);
+                               $buf .= $edit;
+                               # ºÇ¸å¤¬²þ¹Ô¤Ç¤Ê¤¤¾ì¹ç¤À¤±²þ¹Ô¤òÄɲáʼ¡¤Î¥»¥¯¥·¥ç¥ó¤È¤¯¤Ã¤Ä¤¤¤Æ¤·¤Þ¤¦¤¿¤á¡Ë
+                               $buf .= "\n" unless($edit =~ /\n$/);
+                       }
+                       $count++;
+               }
+               if($flag==0){
+                       $buf .= "$line\n";
+               }
+       }
+       return $buf;
+}
+
+#==============================================================================
+# ¥Ú¡¼¥¸É½¼¨»þ¤Î¥Õ¥Ã¥¯¥á¥½¥Ã¥É
+# ¡ÖÊÔ½¸¡×¥á¥Ë¥å¡¼¤òÍ­¸ú¤Ë¤·¤Þ¤¹
+#==============================================================================
+sub hook {
+       my $self = shift;
+       my $wiki = shift;
+       my $cgi  = $wiki->get_CGI;
+       
+       my $pagename = $cgi->param("page");
+       my $login    = $wiki->get_login_info();
+       
+       # ÊÔ½¸¥á¥Ë¥å¡¼¤ÎÀ©¸æ
+       if($wiki->can_modify_page($pagename)){
+               $wiki->add_menu("ÊÔ½¸",$wiki->create_url({ action=>"EDIT",page=>$pagename }));
+       }
+}
+
+1;