OSDN Git Service

編集画面で差分を確認できるようにした。
[fswiki/fswiki.git] / plugin / core / EditPage.pm
1 ###############################################################################
2
3 # ¥Ú¡¼¥¸¤òÊÔ½¸¤¹¤ë¥×¥é¥°¥¤¥ó
4
5 ###############################################################################
6 package plugin::core::EditPage;
7 use strict;
8 use plugin::core::Diff;
9 #==============================================================================
10 # ¥³¥ó¥¹¥È¥é¥¯¥¿
11 #==============================================================================
12 sub new {
13         my $class = shift;
14         my $self = {};
15         return bless $self,$class;
16 }
17
18 #==============================================================================
19 # ¥¢¥¯¥·¥ç¥ó¤Î¼Â¹Ô
20 #==============================================================================
21 sub do_action {
22         my $self = shift;
23         my $wiki = shift;
24         my $cgi = $wiki->get_CGI;
25         
26         my $pagename = $cgi->param("page");
27         my $format   = $wiki->get_edit_format();
28         my $content  = $cgi->param("content");
29         my $sage     = $cgi->param("sage");
30         my $template = $cgi->param("template");
31         my $artno    = $cgi->param("artno");
32         my $time     = $wiki->get_last_modified($pagename);
33         
34         my $buf = "";
35         my $login = $wiki->get_login_info();
36
37         if($pagename eq ""){
38                 return $wiki->error("¥Ú¡¼¥¸¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
39         }
40         if($pagename =~ /([\|\[\]])|^:|([^:]:[^:])/){
41                 return $wiki->error("¥Ú¡¼¥¸Ì¾¤Ë»ÈÍѤǤ­¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£");
42         }
43         if(!$wiki->can_modify_page($pagename)){
44                 return $wiki->error("¥Ú¡¼¥¸¤ÎÊÔ½¸¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
45         }
46         
47         #--------------------------------------------------------------------------
48         # Êݸ½èÍý
49         if($cgi->param("save") ne ""){
50                 if($wiki->config('page_max') ne '' && $wiki->config('page_max') > 0){
51                         if(length($content) > $wiki->config('page_max')){
52                                 return $wiki->error('¥Ú¡¼¥¸¤¬Êݸ²Äǽ¤ÊºÇÂ祵¥¤¥º¤òĶ¤¨¤Æ¤¤¤Þ¤¹¡£');
53                         }
54                 }
55                 if($wiki->page_exists($pagename) && $cgi->param("lastmodified") != $time){
56                         $buf .= "<p><span class=\"error\">¥Ú¡¼¥¸¤Ï´û¤ËÊ̤Υ桼¥¶¤Ë¤è¤Ã¤Æ¹¹¿·¤µ¤ì¤Æ¤¤¤Þ¤¹¡£</span></p>";
57                         
58                         my $mode = $wiki->get_edit_format();
59                         my $orig_source = undef;
60                         if($artno eq ""){
61                                 $orig_source = $wiki->convert_from_fswiki($wiki->get_page($pagename), $mode);
62                         } else {
63                                 $orig_source = $wiki->convert_from_fswiki(&read_by_part($wiki->get_page($pagename), $artno), $mode);
64                         }
65                         my $your_source = $content;
66                         $your_source =~ s/\r\n/\n/g;
67                         $your_source =~ s/\r/\n/g;
68                         
69                         my $diff = plugin::core::Diff::_get_diff_html($orig_source, $your_source);
70                         $diff =~ s/\n/<br>/g;
71                         
72                         $buf .= qq|
73                                 <ul>
74                                   <li>Äɲ䵤줿Éôʬ¤Ï<ins class="diff">¤³¤Î¤è¤¦¤Ë</ins>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
75                                   <li>ºï½ü¤µ¤ì¤¿Éôʬ¤Ï<del class="diff">¤³¤Î¤è¤¦¤Ë</del>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
76                                 </ul>
77                                 <p>
78                                   ºÇ¿·ÈǤȤκ¹Ê¬¤ò³Îǧ¤·¤ÆºÆÅÙÊÔ½¸¤ò¹Ô¤Ã¤Æ¤¯¤À¤µ¤¤¡§
79                                 </p>
80                                 <div class="diff">$diff</div>
81                         |;
82                         
83                         $content = $orig_source;
84                         
85                 } else {
86                         #my $save_content = $content;
87                         my $mode = $wiki->get_edit_format();
88                         my $save_content = $wiki->convert_to_fswiki($content,$mode);
89
90                         # ¥Ñ¡¼¥ÈÊÔ½¸¤Î¾ì¹ç
91                         if($artno ne ""){
92                                 $save_content = &make_save_source($wiki->get_page($pagename), $save_content, $artno, $wiki);
93                         }
94                         # FrontPage¤Ïºï½üÉÔ²Ä
95                         if($pagename eq $wiki->config("frontpage") && $save_content eq ""){
96                                 $buf = "<b>".&Util::escapeHTML($wiki->config("frontpage"))."¤Ïºï½ü¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£</b>\n";
97
98                         # ¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï½èÍý¤ò¼Â¹Ô¤·¤Æ¥á¥Ã¥»¡¼¥¸¤òÊÖµÑ
99                         } else {
100                                 $wiki->save_page($pagename, $save_content, $sage);
101                                 
102                                 if($content ne ""){
103                                         $wiki->redirect($pagename, $artno);
104                                 } else {
105                                         if($artno eq ""){
106                                                 $wiki->set_title($pagename."¤òºï½ü¤·¤Þ¤·¤¿");
107                                                 return Util::escapeHTML($pagename)."¤òºï½ü¤·¤Þ¤·¤¿¡£";
108                                         } else {
109                                                 $wiki->set_title($pagename."¤Î¥Ñ¡¼¥È¤òºï½ü¤·¤Þ¤·¤¿");
110                                                 return Util::escapeHTML($pagename)."¤Î¥Ñ¡¼¥È¤òºï½ü¤·¤Þ¤·¤¿¡£";
111                                         }
112                                 }
113                         }
114                 }
115         #--------------------------------------------------------------------------
116         # º¹Ê¬³Îǧ½èÍý
117         } elsif($cgi->param("diff") ne ""){
118                 if($wiki->config('page_max') ne '' && $wiki->config('page_max') > 0){
119                         if(length($content) > $wiki->config('page_max')){
120                                 return $wiki->error('¥Ú¡¼¥¸¤¬Êݸ²Äǽ¤ÊºÇÂ祵¥¤¥º¤òĶ¤¨¤Æ¤¤¤Þ¤¹¡£');
121                         }
122                 }
123                 $time = $cgi->param("lastmodified");
124                 
125                 my $mode = $wiki->get_edit_format();
126                 my $orig_source = undef;
127                 if($artno eq ""){
128                         $orig_source = $wiki->convert_from_fswiki($wiki->get_page($pagename), $mode);
129                 } else {
130                         $orig_source = $wiki->convert_from_fswiki(&read_by_part($wiki->get_page($pagename), $artno), $mode);
131                 }
132                 my $your_source = $content;
133                 $your_source =~ s/\r\n/\n/g;
134                 $your_source =~ s/\r/\n/g;
135                 
136                 $buf .= qq|
137                         <ul>
138                           <li>Äɲ䵤줿Éôʬ¤Ï<ins class="diff">¤³¤Î¤è¤¦¤Ë</ins>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
139                           <li>ºï½ü¤µ¤ì¤¿Éôʬ¤Ï<del class="diff">¤³¤Î¤è¤¦¤Ë</del>ɽ¼¨¤µ¤ì¤Þ¤¹¡£</li>
140                         </ul>
141                 |;
142                         
143                 if($orig_source eq $your_source){
144                         $buf .= '<p class="error">º¹Ê¬¤Ï¤¢¤ê¤Þ¤»¤ó¡£</p>';
145                 } else {
146                         my $diff = plugin::core::Diff::_get_diff_html($your_source, $orig_source);
147                         $diff =~ s/\n/<br>/g;
148                         $buf .= qq|<div class="diff">$diff</div>|;
149                 }
150                 
151         #--------------------------------------------------------------------------
152         # ¥×¥ì¥Ó¥å¡¼½èÍý
153         } elsif($cgi->param("preview") ne ""){
154                 if($wiki->config('page_max') ne '' && $wiki->config('page_max') > 0){
155                         if(length($content) > $wiki->config('page_max')){
156                                 return $wiki->error('¥Ú¡¼¥¸¤¬Êݸ²Äǽ¤ÊºÇÂ祵¥¤¥º¤òĶ¤¨¤Æ¤¤¤Þ¤¹¡£');
157                         }
158                 }
159                 $time = $cgi->param("lastmodified");
160                 $buf = "°Ê²¼¤Î¥×¥ì¥Ó¥å¡¼¤ò³Îǧ¤·¤Æ¤è¤í¤·¤±¤ì¤Ð¡ÖÊݸ¡×¥Ü¥¿¥ó¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤¡£<br>";
161                 if($content eq ""){
162                         if($pagename eq $wiki->config("frontpage") && $artno eq ""){
163                                 $buf = $buf."<b>¡Ê".&Util::escapeHTML($wiki->config("frontpage"))."¤Ïºï½ü¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¡Ë</b>";
164                         } else {
165                                 if($artno eq ""){
166                                         $buf = $buf."<b>¡Ê¥Ú¡¼¥¸ÆâÍƤ϶õ¤Ç¤¹¡£¹¹¿·¤¹¤ë¤È¤³¤Î¥Ú¡¼¥¸¤Ïºï½ü¤µ¤ì¤Þ¤¹¡£¡Ë</b>";
167                                 } else {
168                                         $buf = $buf."<b>¡Ê¥Ú¡¼¥¸ÆâÍƤ϶õ¤Ç¤¹¡£¹¹¿·¤¹¤ë¤È¤³¤Î¥Ñ¡¼¥È¤Ïºï½ü¤µ¤ì¤Þ¤¹¡£¡Ë</b>";
169                                 }
170                         }
171                 }
172                 $content = $wiki->convert_to_fswiki($content,$format);
173                 $buf = $buf."<br>".$wiki->process_wiki($content);
174
175         } elsif($wiki->page_exists($pagename)) {
176                 #¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¾ì¹ç
177                 if($artno eq ""){
178                         $content = $wiki->get_page($pagename);
179                 } else {
180                         $content = &read_by_part($wiki->get_page($pagename), $artno);
181                 }
182         } elsif($template ne ""){
183                 #¥Æ¥ó¥×¥ì¡¼¥È¤ò»ØÄꤵ¤ì¤¿¾ì¹ç
184                 $content = $wiki->get_page($template);
185         }
186         
187         #--------------------------------------------------------------------------
188         # ÆþÎÏ¥Õ¥©¡¼¥à
189         $wiki->set_title($pagename."¤ÎÊÔ½¸",1);
190
191         my $tmpl = HTML::Template->new(filename=>$wiki->config('tmpl_dir')."/editform.tmpl",
192                                    die_on_bad_params => 0);
193
194         $tmpl->param({SCRIPT_NAME   => $wiki->create_url(),
195                                   PAGE_NAME     => $pagename,
196                                   CONTENT       => $wiki->convert_from_fswiki($content, $format),
197                                   LAST_MODIFIED => $time,
198                                   ACTION        => 'EDIT',
199                                   EXISTS_PAGE   => $wiki->page_exists($pagename),
200                                   SAGE          => $sage});
201         
202         if($artno ne ""){
203                 $tmpl->param(OPTIONAL_PARAMS=>[{NAME=>'artno', VALUE=>$artno}]);
204         }
205
206         $buf .= $tmpl->output();
207
208         # ¥×¥é¥°¥¤¥ó¤òÁÞÆþ
209         $buf .= $wiki->get_editform_plugin();
210         
211         return $buf;
212 }
213
214 #==============================================================================
215 # ¥Ñ¡¼¥ÈÊÔ½¸¤Î¾ì¹ç¤ÎÊÔ½¸Éôʬ¤Î¼è¤ê½Ð¤·
216 #==============================================================================
217 sub read_by_part {
218         my $page  = shift;
219         my $num   = shift;
220         my $count = 0;
221         my $buf   = "";
222         my $level = 0;
223         my $flag  = 0;
224         foreach my $line (split(/\n/,$page)){
225                 if($line=~/^(!{1,3})/){
226                         if($flag==1 && $level<=length($1)){
227                                 last;
228                         }
229                         if($count==$num){
230                                 $flag  = 1;
231                                 $level = length($1);
232                         }
233                         $count++;
234                 }
235                 if($flag==1){
236                         $buf .= $line."\n";
237                 }
238         }
239         return $buf;
240 }
241
242 #==============================================================================
243 # ¥Ñ¡¼¥ÈÊÔ½¸¤Î¾ì¹ç¤ÎÊݸÍÑ¥½¡¼¥¹¤ÎºîÀ®
244 #==============================================================================
245 sub make_save_source {
246         my $org   = shift;
247         my $edit  = shift;
248         my $num   = shift;
249         my $wiki  = shift;
250         my $count = 0;
251         my $buf   = "";
252         my $level = "";
253         my $flag  = "";
254         foreach my $line (split(/\n/,$org)){
255                 if($line=~/^(!{1,3})/){
256                         if($flag==1 && $level<=length($1)){
257                                 $flag = 0;
258                         }
259                         if($count==$num){
260                                 $flag  = 1;
261                                 $level = length($1);
262                                 $buf .= $edit;
263                                 # ºÇ¸å¤¬²þ¹Ô¤Ç¤Ê¤¤¾ì¹ç¤À¤±²þ¹Ô¤òÄɲáʼ¡¤Î¥»¥¯¥·¥ç¥ó¤È¤¯¤Ã¤Ä¤¤¤Æ¤·¤Þ¤¦¤¿¤á¡Ë
264                                 $buf .= "\n" unless($edit =~ /\n$/);
265                         }
266                         $count++;
267                 }
268                 if($flag==0){
269                         $buf .= "$line\n";
270                 }
271         }
272         return $buf;
273 }
274
275 #==============================================================================
276 # ¥Ú¡¼¥¸É½¼¨»þ¤Î¥Õ¥Ã¥¯¥á¥½¥Ã¥É
277 # ¡ÖÊÔ½¸¡×¥á¥Ë¥å¡¼¤òÍ­¸ú¤Ë¤·¤Þ¤¹
278 #==============================================================================
279 sub hook {
280         my $self = shift;
281         my $wiki = shift;
282         my $cgi  = $wiki->get_CGI;
283         
284         my $pagename = $cgi->param("page");
285         my $login    = $wiki->get_login_info();
286         
287         # ÊÔ½¸¥á¥Ë¥å¡¼¤ÎÀ©¸æ
288         if($wiki->can_modify_page($pagename)){
289                 $wiki->add_menu("ÊÔ½¸",$wiki->create_url({ action=>"EDIT",page=>$pagename }));
290         }
291 }
292
293 1;