OSDN Git Service

33862c9fc67f9d2c51ec71566c713602d4dfd407
[fswiki/fswiki.git] / lib / Wiki.pm
1 ###############################################################################
2 # <p>
3 # Wiki API
4 # </p>
5 ###############################################################################
6 package Wiki;
7 use strict;
8 use CGI2;
9 use File::Copy;
10 use File::Path;
11 use HTTP::Status;
12 use Wiki::DefaultStorage;
13 use Wiki::HTMLParser;
14 use vars qw($VERSION $DEBUG);
15 $VERSION = '3.6.5';
16 $DEBUG   = 0;
17 #==============================================================================
18 # <p>
19 #   ¥³¥ó¥¹¥È¥é¥¯¥¿
20 # </p>
21 #==============================================================================
22 sub new {
23         my $class = shift;
24         my $self  = {};
25         
26         # ÀßÄê¤òÆɤ߹þ¤ß
27         my $setupfile = shift || 'setup.dat';
28         $self->{"config"} = &Util::load_config_hash(undef,$setupfile);
29         die "setup file ${setupfile} not found" if (keys %{$self->{"config"}} == 0);
30         $self->{"config"}->{"plugin_dir"} = "."         unless exists($self->{"config"}->{"plugin_dir"});
31         $self->{"config"}->{"frontpage"}  = "FrontPage" unless exists($self->{"config"}->{"frontpage"});
32         unshift(@INC, $self->{"config"}->{"plugin_dir"});
33         $ENV{'TZ'} = $self->{"config"}->{"time_zone"};
34         $CGI::POST_MAX = $self->{"config"}->{"post_max"} if $self->{"config"}->{"post_max"} ne '';
35         
36         # ¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤ò½é´ü²½
37         $self->{"handler"}            = {};
38         $self->{"handler_permission"} = {};
39         $self->{"plugin"}             = {};
40         $self->{"title"}              = "";
41         $self->{"menu"}               = [];
42         $self->{"CGI"}                = CGI2->new();
43         $self->{"hook"}               = {};
44         $self->{"user"}               = ();
45         $self->{"admin_menu"}         = ();
46         $self->{"editform"}           = ();
47         $self->{"edit"}               = 0;
48         $self->{"parse_times"}        = 0;
49         $self->{"format"}             = {};
50         $self->{"installed_plugin"}   = ();
51         $self->{"head_info"}          = ();
52         
53         # ¥¹¥È¥ì¡¼¥¸¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®
54         if($self->{config}->{"storage"} eq ""){
55                 $self->{"storage"} = Wiki::DefaultStorage->new($self);
56         } else {
57                 eval ("use ".$self->{config}->{"storage"}.";");
58                 $self->{"storage"} = $self->{config}->{"storage"}->new($self);
59         }
60         
61         return bless $self,$class;
62 }
63
64 ###############################################################################
65 #
66 # ¥æ¡¼¥¶´Ø·¸¤Î¥á¥½¥Ã¥É·²
67 #
68 ###############################################################################
69 #==============================================================================
70 # <p>
71 #   ¥æ¡¼¥¶¤òÄɲä·¤Þ¤¹
72 # </p>
73 # <pre>
74 # $wiki-&gt;add_user(ID,¥Ñ¥¹¥ï¡¼¥É,¥æ¡¼¥¶¥¿¥¤¥×);
75 # </pre>
76 # <p>
77 # ¥æ¡¼¥¶¥¿¥¤¥×¤Ë¤Ï´ÉÍý¼Ô¥æ¡¼¥¶¤Î¾ì¹ç0¡¢°ìÈ̥桼¥¶¤Î¾ì¹ç1¤ò»ØÄꤷ¤Þ¤¹¡£
78 # ¤Ê¤ª¡¢¤³¤Î¥á¥½¥Ã¥É¤Ï¼Â¹Ô»þ¤ËWiki.pm¤Ë¥æ¡¼¥¶¤òÄɲ乤뤿¤á¤Î¤â¤Î¤Ç¡¢
79 # ¤³¤Î¥á¥½¥Ã¥É¤ËÂФ·¤Æ¥æ¡¼¥¶¤òÄɲ䷤Ƥâ±Ê³²½¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£
80 # </p>
81 #==============================================================================
82 sub add_user {
83         my $self = shift;
84         my $id   = shift;
85         my $pass = shift;
86         my $type = shift;
87
88         push(@{$self->{"user"}},{id=>$id,pass=>$pass,type=>$type});
89 }
90
91 #==============================================================================
92 # <p>
93 #   ¥æ¡¼¥¶¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤·¤Þ¤¹
94 # </p>
95 #==============================================================================
96 sub user_exists {
97         my $self = shift;
98         my $id   = shift;
99         foreach my $user (@{$self->{"user"}}){
100                 if($user->{id} eq $id){
101                         return 1;
102                 }
103         }
104         return 0;
105 }
106
107 #==============================================================================
108 # <p>
109 #   ¥í¥°¥¤¥ó¾ðÊó¤ò¼èÆÀ¤·¤Þ¤¹¡£
110 #   ¥í¥°¥¤¥ó¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¥í¥°¥¤¥ó¾ðÊó¤ò´Þ¤ó¤À¥Ï¥Ã¥·¥å¥ê¥Õ¥¡¥ì¥ó¥¹¤ò¡¢
111 #   ¥í¥°¥¤¥ó¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ïundef¤òÊÖ¤·¤Þ¤¹¡£
112 # </p>
113 # <pre>
114 # my $info = $wiki-&gt;get_login_info();
115 # if(defined($info)){          # ¥í¥°¥¤¥ó¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ïundef
116 #   my $id   = $info-&gt;{id};    # ¥í¥°¥¤¥ó¥æ¡¼¥¶¤ÎID
117 #   my $type = $info-&gt;{type};  # ¥í¥°¥¤¥ó¥æ¡¼¥¶¤Î¼ïÊÌ(0:´ÉÍý¼Ô 1:°ìÈÌ)
118 # }
119 # </pre>
120 #==============================================================================
121 sub get_login_info {
122         my $self = shift;
123         if (exists($self->{'login_info'})){
124                 return $self->{'login_info'};
125         }
126
127         my $cgi = $self->get_CGI();
128         return undef unless(defined($cgi));
129         
130         my $session = $cgi->get_session($self);
131         unless(defined($session)){
132                 $self->{'login_info'} = undef;
133                 return undef;
134         }
135         my $id   = $session->param("wiki_id");
136         my $type = $session->param("wiki_type");
137         my $path = $session->param("wiki_path");
138
139         # PATH_INFO¤òÄ´¤Ù¤ë
140         my $path_info = $cgi->path_info();
141         if(!defined($path_info)){ $path_info  = ""; }
142         if(!defined($path     )){ $path       = ""; }
143         if(!defined($id       )){ $id         = ""; }
144         if(!defined($type     )){ $type       = ""; }
145         
146         if($path_info eq "" && $path ne ""){
147                 $self->{'login_info'} = undef;
148                 return undef;
149         } elsif($path ne "" && !($path_info =~ /^$path($|\/)/)){
150                 $self->{'login_info'} = undef;
151                 return undef;
152         }
153         
154         # ¥¯¥Ã¥­¡¼¤¬¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Ê¤¤
155         if($id eq "" ||  $type eq ""){
156                 $self->{'login_info'} = undef;
157                 return undef;
158         }
159         
160         # ¥æ¡¼¥¶¾ðÊó¤òÊÖµÑ
161         $self->{'login_info'} = {id=>$id,type=>$type,path=>$path};
162         return $self->{'login_info'};
163 }
164
165 #==============================================================================
166 # <p>
167 #   ¥í¥°¥¤¥ó¥Á¥§¥Ã¥¯¤ò¹Ô¤¤¤Þ¤¹¡£
168 # </p>
169 #==============================================================================
170 sub login_check {
171         my $self = shift;
172         my $id   = shift;
173         my $pass = shift;
174         my $path = $self->get_CGI()->path_info();
175         foreach(@{$self->{"user"}}){
176                 if($_->{id} eq $id && $_->{pass} eq $pass){
177                         return {id=>$id,pass=>$pass,type=>$_->{type},path=>$path};
178                 }
179         }
180         return undef;
181 }
182
183 ###############################################################################
184 #
185 # ¥×¥é¥°¥¤¥ó´Ø·¸¤Î¥á¥½¥Ã¥É·²
186 #
187 ###############################################################################
188 #==============================================================================
189 # <p>
190 #   ¥¨¥Ç¥£¥Ã¥È¥Õ¥©¡¼¥à¥×¥é¥°¥¤¥ó¤òÄɲä·¤Þ¤¹
191 # </p>
192 # <pre>
193 # $wiki-&gt;add_editform_plugin(¥¨¥Ç¥£¥Ã¥È¥Õ¥©¡¼¥à¥×¥é¥°¥¤¥ó¤Î¥¯¥é¥¹Ì¾,Í¥ÀèÅÙ);
194 # </pre>
195 # <p>
196 # Í¥ÀèÅÙ¤¬Â礭¤¤¤Û¤É¾å°Ì¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£
197 # </p>
198 #==============================================================================
199 sub add_editform_plugin {
200         my $self   = shift;
201         my $plugin = shift;
202         my $weight = shift;
203         push(@{$self->{"editform"}},{class=>$plugin,weight=>$weight});
204 }
205
206 #==============================================================================
207 # <p>
208 #   ÊÔ½¸¥Õ¥©¡¼¥àÍѤΥץ饰¥¤¥ó¤Î½ÐÎϤò¼èÆÀ¤·¤Þ¤¹
209 # </p>
210 #==============================================================================
211 sub get_editform_plugin {
212         my $self = shift;
213         my $buf = "";
214         foreach my $plugin (sort { $b->{weight}<=>$a->{weight} } @{$self->{"editform"}}){
215                 my $obj = $self->get_plugin_instance($plugin->{class});
216                 $buf .= $obj->editform($self)."\n";
217         }
218         return $buf;
219 }
220
221 #==============================================================================
222 # <p>
223 # ´ÉÍý¼ÔÍѤΥá¥Ë¥å¡¼¤òÄɲä·¤Þ¤¹¡£´ÉÍý¼Ô¥æ¡¼¥¶¤¬¥í¥°¥¤¥ó¤·¤¿¾ì¹ç¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£
224 # Í¥ÀèÅÙ¤¬¹â¤¤¤Û¤É¾å¤Î¤Û¤¦¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£
225 # </p>
226 # <pre>
227 # $wiki-&gt;add_admin_menu(¥á¥Ë¥å¡¼¹àÌÜ̾,Á«°Ü¤¹¤ëURL,Í¥ÀèÅÙ,¾ÜºÙÀâÌÀ);
228 # </pre>
229 #==============================================================================
230 sub add_admin_menu {
231         my $self   = shift;
232         my $label  = shift;
233         my $url    = shift;
234         my $weight = shift;
235         my $desc   = shift;
236         
237         push(@{$self->{"admin_menu"}},{label=>$label,url=>$url,weight=>$weight,desc=>$desc,type=>0});
238 }
239
240 #==============================================================================
241 # <p>
242 # ¥í¥°¥¤¥ó¥æ¡¼¥¶ÍѤΥá¥Ë¥å¡¼¤òÄɲä·¤Þ¤¹¡£
243 # ¥æ¡¼¥¶¤¬¥í¥°¥¤¥ó¤·¤¿¾ì¹ç¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£´ÉÍý¼Ô¥æ¡¼¥¶¤Î¾ì¹ç¤âɽ¼¨¤µ¤ì¤Þ¤¹¡£
244 # Í¥ÀèÅÙ¤¬¹â¤¤¤Û¤É¾å¤Î¤Û¤¦¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£
245 # </p>
246 # <pre>
247 # $wiki-&gt;add_admin_menu(¥á¥Ë¥å¡¼¹àÌÜ̾,Á«°Ü¤¹¤ëURL,Í¥ÀèÅÙ,¾ÜºÙÀâÌÀ);
248 # </pre>
249 #==============================================================================
250 sub add_user_menu {
251         my $self   = shift;
252         my $label  = shift;
253         my $url    = shift;
254         my $weight = shift;
255         my $desc   = shift;
256         
257         push(@{$self->{"admin_menu"}},{label=>$label,url=>$url,weight=>$weight,desc=>$desc,type=>1});
258 }
259
260 #==============================================================================
261 # <p>
262 # ´ÉÍý¼ÔÍѤΥá¥Ë¥å¡¼¤ò¼èÆÀ¤·¤Þ¤¹¡£
263 # </p>
264 #==============================================================================
265 sub get_admin_menu {
266         my $self = shift;
267         return sort { $b->{weight}<=>$a->{weight} } @{$self->{"admin_menu"}};
268 }
269
270 #==============================================================================
271 # <p>
272 # ¥×¥é¥°¥¤¥ó¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤Ïwiki.cgi¤Ë¤è¤Ã¤Æcall¤µ¤ì¤Þ¤¹¡£
273 # ¥×¥é¥°¥¤¥ó³«È¯¤Ë¤ª¤¤¤ÆÄ̾¤³¤Î¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¡£
274 # </p>
275 #==============================================================================
276 sub install_plugin {
277         my $self   = shift;
278         my $plugin = shift;
279         
280         if ($plugin =~ /\W/) {
281                 return "<div class=\"error\">".Util::escapeHTML("${plugin}¥×¥é¥°¥¤¥ó¤ÏÉÔÀµ¤Ê¥×¥é¥°¥¤¥ó¤Ç¤¹¡£")."</div>";
282         }
283                 
284         my $module = "plugin::${plugin}::Install";
285         eval 'require &Util::get_module_file($module);'.$module.'::install($self);';
286         
287         if($@){
288                 return "<div class=\"error\">".Util::escapeHTML("${plugin}¥×¥é¥°¥¤¥ó¤¬¥¤¥ó¥¹¥È¡¼¥ë¤Ç¤­¤Þ¤»¤ó¡£$@")."</div>";
289         } else {
290                 push(@{$self->{"installed_plugin"}},$plugin);
291                 return "";
292         }
293 }
294
295 #==============================================================================
296 # <p>
297 # ¥×¥é¥°¥¤¥ó¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤òÄ´¤Ù¤Þ¤¹¡£
298 # </p>
299 #==============================================================================
300 sub is_installed {
301         my $self   = shift;
302         my $plugin = shift;
303         
304         foreach (@{$self->{"installed_plugin"}}){
305                 if($_ eq $plugin){
306                         return 1;
307                 }
308         }
309         return 0;
310 }
311
312 #==============================================================================
313 # <p>
314 # ¥á¥Ë¥å¡¼¹àÌܤòÄɲä·¤Þ¤¹¡£´û¤ËƱ¤¸Ì¾Á°¤Î¹àÌܤ¬ÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¾å½ñ¤­¤·¤Þ¤¹¡£
315 # Í¥ÀèÅÙ¤¬¹â¤¤¤Û¤Éº¸Â¦¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£
316 # </p>
317 # <pre>
318 # $wiki-&gt;add_menu(¹àÌÜ̾,URL,Í¥ÀèÅÙ,¥¯¥í¡¼¥ë¤òµñÈݤ¹¤ë¤«¤É¤¦¤«);
319 # </pre>
320 # <p>
321 # ¸¡º÷¥¨¥ó¥¸¥ó¤Ë¥¯¥í¡¼¥ë¤µ¤»¤¿¤¯¤Ê¤¤¾ì¹ç¤ÏÂè4°ú¿ô¤Ë1¡¢µö²Ä¤¹¤ë¾ì¹ç¤Ï0¤ò»ØÄꤷ¤Þ¤¹¡£
322 # ¾Êά¤·¤¿¾ì¹ç¤Ï¥¯¥í¡¼¥ë¤òµö²Ä¤·¤Þ¤¹¡£
323 # </p>
324 #==============================================================================
325 sub add_menu {
326         my $self     = shift;
327         my $name     = shift;
328         my $href     = shift;
329         my $weight   = shift;
330         my $nofollow = shift;
331         
332         my $flag = 0;
333         foreach(@{$self->{"menu"}}){
334                 if($_->{name} eq $name){
335                         $_->{href} = $href;
336                         $flag = 1;
337                         last;
338                 }
339         }
340         if($flag==0){
341                 push(@{$self->{"menu"}},{name=>$name,href=>$href,weight=>$weight,nofollow=>$nofollow});
342         }
343 }
344
345 #===============================================================================
346 # <p>
347 # ¥Õ¥Ã¥¯¥×¥é¥°¥¤¥ó¤òÅÐÏ¿¤·¤Þ¤¹¡£ÅÐÏ¿¤·¤¿¥×¥é¥°¥¤¥ó¤Ïdo_hook¥á¥½¥Ã¥É¤Ç¸Æ¤Ó½Ð¤·¤Þ¤¹¡£
348 # </p>
349 # <pre>
350 # $wiki-&gt;add_hook(¥Õ¥Ã¥¯Ì¾,¥Õ¥Ã¥¯¥×¥é¥°¥¤¥ó¤Î¥¯¥é¥¹Ì¾);
351 # </pre>
352 #===============================================================================
353 sub add_hook {
354         my $self = shift;
355         my $name = shift;
356         my $obj  = shift;
357         
358         push(@{$self->{"hook"}->{$name}},$obj);
359 }
360
361 #===============================================================================
362 # <p>
363 # add_hook¥á¥½¥Ã¥É¤ÇÅÐÏ¿¤µ¤ì¤¿¥Õ¥Ã¥¯¥×¥é¥°¥¤¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£
364 # °ú¿ô¤Ë¤Ï¥Õ¥Ã¥¯¤Î̾Á°¤Ë²Ã¤¨¤ÆǤ°Õ¤Î¥Ñ¥é¥á¡¼¥¿¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£
365 # ¤³¤ì¤é¤Î¥Ñ¥é¥á¡¼¥¿¤Ï¸Æ¤Ó½Ð¤µ¤ì¤ë¥¯¥é¥¹¤Îhook¥á¥½¥Ã¥É¤Î°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤Þ¤¹¡£
366 # </p>
367 # <pre>
368 # $wiki-&gt;do_hook(¥Õ¥Ã¥¯Ì¾[,°ú¿ô1[,°ú¿ô2...]]);
369 # </pre>
370 #===============================================================================
371 sub do_hook {
372         my $self = shift;
373         my $name = shift;
374         
375         foreach my $class (@{$self->{"hook"}->{$name}}){
376                 my $obj = $self->get_plugin_instance($class);
377                 $obj->hook($self,$name,@_);
378         }
379 }
380
381 #==============================================================================
382 # <p>
383 # ¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¥×¥é¥°¥¤¥ó¤òÄɲä·¤Þ¤¹¡£
384 # ¥ê¥¯¥¨¥¹¥È»þ¤Ëaction¤È¤¤¤¦¥Ñ¥é¥á¡¼¥¿¤¬°ìÃפ¹¤ë¥¢¥¯¥·¥ç¥ó¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
385 # </p>
386 # <pre>
387 # $wiki-&gt;add_handler(action¥Ñ¥é¥á¡¼¥¿,¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¤Î¥¯¥é¥¹Ì¾);
388 # </pre>
389 #==============================================================================
390 sub add_handler {
391         my $self   = shift;
392         my $action = shift;
393         my $class  = shift;
394         
395         $self->{"handler"}->{$action}=$class;
396         $self->{"handler_permission"}->{$action} = 1;
397 }
398
399 #==============================================================================
400 # <p>
401 # ¥í¥°¥¤¥ó¥æ¡¼¥¶ÍѤΥ¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¤òÄɲä·¤Þ¤¹¡£
402 # ¤³¤Î¥á¥½¥Ã¥É¤Ë¤è¤Ã¤ÆÄɲ䵤줿¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¤Ï¥í¥°¥¤¥ó¤·¤Æ¤¤¤ë¾ì¹ç¤Î¤ß¼Â¹Ô²Äǽ¤Ç¤¹¡£
403 # ¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£
404 # </p>
405 # <pre>
406 # $wiki-&gt;add_user_handler(action¥Ñ¥é¥á¡¼¥¿,¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¤Î¥¯¥é¥¹Ì¾);
407 # </pre>
408 #==============================================================================
409 sub add_user_handler {
410         my $self   = shift;
411         my $action = shift;
412         my $class  = shift;
413         
414         $self->{"handler"}->{$action}=$class;
415         $self->{"handler_permission"}->{$action} = 2;
416 }
417
418 #==============================================================================
419 # <p>
420 # ´ÉÍý¼ÔÍѤΥ¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¤òÄɲä·¤Þ¤¹¡£
421 # ¤³¤Î¥á¥½¥Ã¥É¤Ë¤è¤Ã¤ÆÄɲ䵤줿¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¤Ï´ÉÍý¼Ô¤È¤·¤Æ¥í¥°¥¤¥ó¤·¤Æ¤¤¤ë¾ì¹ç¤Î¤ß¼Â¹Ô²Äǽ¤Ç¤¹¡£
422 # ¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£
423 # </p>
424 # <pre>
425 # $wiki-&gt;add_admin_handler(action¥Ñ¥é¥á¡¼¥¿,¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¤Î¥¯¥é¥¹Ì¾);
426 # </pre>
427 #==============================================================================
428 sub add_admin_handler {
429         my $self   = shift;
430         my $action = shift;
431         my $class  = shift;
432         
433         $self->{"handler"}->{$action}=$class;
434         $self->{"handler_permission"}->{$action} = 0;
435 }
436 #==============================================================================
437 # <p>
438 # ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤òÄɲä·¤Þ¤¹¡£
439 # </p>
440 # <p>
441 # ¤³¤Î¥á¥½¥Ã¥É¤Ï3.4·Ï¤È¤Î¸ß´¹À­¤ò°Ý»ý¤¹¤ë¤¿¤á¤Ë»Ä¤·¤Þ¤·¤¿¡£3.6¤ÇÇѻߤ¹¤ë¤â¤Î¤È¤·¤Þ¤¹¡£
442 # </p>
443 #==============================================================================
444 sub add_plugin {
445         my $self   = shift;
446         my $name   = shift;
447         my $class  = shift;
448         
449         $self->add_inline_plugin($name,$class,"HTML");
450 }
451 #==============================================================================
452 # <p>
453 # ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤òÅÐÏ¿¤·¤Þ¤¹¡£¥×¥é¥°¥¤¥ó¤Î½ÐÎÏ¥¿¥¤¥×¤Ë¤Ï"WIKI"¤Þ¤¿¤Ï"HTML"¤ò»ØÄꤷ¤Þ¤¹¡£
454 # ¾Êά¤·¤¿¾ì¹ç¤Ï"HTML"¤ò»ØÄꤷ¤¿¤â¤Î¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£
455 # </p>
456 # <pre>
457 # $wiki-&gt;add_inline_plugin(¥×¥é¥°¥¤¥ó̾,¥×¥é¥°¥¤¥ó¤Î¥¯¥é¥¹Ì¾,¥×¥é¥°¥¤¥ó¤Î½ÐÎÏ¥¿¥¤¥×);
458 # </pre>
459 #==============================================================================
460 sub add_inline_plugin {
461         my ($self, $name, $class, $format) = @_;
462         
463         if($format eq ""){
464                 $format = "HTML";
465         } else {
466                 $format = uc($format);
467         }
468         
469         $self->{"plugin"}->{$name} = {CLASS=>$class,TYPE=>'inline',FORMAT=>$format};
470 }
471
472 #==============================================================================
473 # <p>
474 # ¥Ñ¥é¥°¥é¥Õ¥×¥é¥°¥¤¥ó¤òÅÐÏ¿¤·¤Þ¤¹¡£¥×¥é¥°¥¤¥ó¤Î½ÐÎÏ¥¿¥¤¥×¤Ë¤Ï"WIKI"¤Þ¤¿¤Ï"HTML"¤ò»ØÄꤷ¤Þ¤¹¡£
475 # ¾Êά¤·¤¿¾ì¹ç¤Ï"HTML"¤ò»ØÄꤷ¤¿¤â¤Î¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£
476 # </p>
477 # <pre>
478 # $wiki-&gt;add_inline_plugin(¥×¥é¥°¥¤¥ó̾,¥×¥é¥°¥¤¥ó¤Î¥¯¥é¥¹Ì¾,¥×¥é¥°¥¤¥ó¤Î½ÐÎÏ¥¿¥¤¥×);
479 # </pre>
480 #==============================================================================
481 sub add_paragraph_plugin {
482         my ($self, $name, $class, $format) = @_;
483         
484         if($format eq ""){
485                 $format = "HTML";
486         } else {
487                 $format = uc($format);
488         }
489         
490         $self->{"plugin"}->{$name} = {CLASS=>$class,TYPE=>'paragraph',FORMAT=>$format};
491 }
492
493 #==============================================================================
494 # <p>
495 # ¥Ö¥í¥Ã¥¯¥×¥é¥°¥¤¥ó¤òÅÐÏ¿¤·¤Þ¤¹¡£¥×¥é¥°¥¤¥ó¤Î½ÐÎÏ¥¿¥¤¥×¤Ë¤Ï"WIKI"¤Þ¤¿¤Ï"HTML"¤ò»ØÄꤷ¤Þ¤¹¡£
496 # ¾Êά¤·¤¿¾ì¹ç¤Ï"HTML"¤ò»ØÄꤷ¤¿¤â¤Î¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£
497 # </p>
498 # <pre>
499 # $wiki-&gt;add_block_plugin(¥×¥é¥°¥¤¥ó̾,¥×¥é¥°¥¤¥ó¤Î¥¯¥é¥¹Ì¾,¥×¥é¥°¥¤¥ó¤Î½ÐÎÏ¥¿¥¤¥×);
500 # </pre>
501 #==============================================================================
502 sub add_block_plugin {
503         my ($self, $name, $class, $format) = @_;
504         
505         if($format eq ""){
506                 $format = "HTML";
507         } else {
508                 $format = uc($format);
509         }
510         
511         $self->{"plugin"}->{$name} = {CLASS=>$class,TYPE=>'block',FORMAT=>$format};
512 }
513
514 #==============================================================================
515 # <p>
516 # ¥×¥é¥°¥¤¥ó¤Î¾ðÊó¤ò¼èÆÀ¤·¤Þ¤¹
517 # </p>
518 # <pre>
519 # my $info = $wiki-&gt;get_plugin_info(&quot;include&quot;);
520 # my $class  = $info-&gt;{CLASS};  # ¥×¥é¥°¥¤¥ó¤Î¥¯¥é¥¹Ì¾
521 # my $type   = $info-&gt;{TYPE};   # inline¡¢paragraph¡¢block¤Î¤¤¤º¤ì¤«
522 # my $format = $info-&gt;{FORMAT}; # HTML¤Þ¤¿¤ÏWIKI
523 # </pre>
524 #==============================================================================
525 sub get_plugin_info {
526         my $self = shift;
527         my $name = shift;
528         
529         return $self->{plugin}->{$name};
530 }
531
532 #==============================================================================
533 # <p>
534 # add_handler¥á¥½¥Ã¥É¤ÇÅÐÏ¿¤µ¤ì¤¿¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¤ò¼Â¹Ô¤·¤Þ¤¹¡£
535 # ¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¤Îdo_action¥á¥½¥Ã¥É¤ÎÌá¤êÃͤòÊÖ¤·¤Þ¤¹¡£
536 # </p>
537 # <pre>
538 # my $content = $wiki-&gt;call_handler(action¥Ñ¥é¥á¡¼¥¿);
539 # </pre>
540 #==============================================================================
541 sub call_handler {
542         my $self   = shift;
543         my $action = shift;
544         
545         if(!defined($action)){
546                 $action = "";
547         }
548         
549         my $obj = $self->get_plugin_instance($self->{"handler"}->{$action});
550         
551         unless(defined($obj)){
552                 return $self->error(RC_BAD_REQUEST, "ÉÔÀµ¤Ê¥¢¥¯¥·¥ç¥ó¤Ç¤¹¡£");
553         }
554         
555         # ´ÉÍý¼ÔÍѤΥ¢¥¯¥·¥ç¥ó
556         if($self->{"handler_permission"}->{$action}==0){
557                 my $login = $self->get_login_info();
558                 if(!defined($login)){
559                         return $self->error(RC_FORBIDDEN, "¥í¥°¥¤¥ó¤·¤Æ¤¤¤Þ¤»¤ó¡£");
560                         
561                 } elsif($login->{type}!=0){
562                         return $self->error(RC_FORBIDDEN, "´ÉÍý¼Ô¸¢¸Â¤¬É¬ÍפǤ¹¡£");
563                 }
564                 return $obj->do_action($self).
565                        "<div class=\"comment\"><a href=\"".$self->create_url({action=>"LOGIN"})."\">¥á¥Ë¥å¡¼¤ËÌá¤ë</a></div>";
566         
567         # ¥í¥°¥¤¥ó¥æ¡¼¥¶ÍѤΥ¢¥¯¥·¥ç¥ó
568         } elsif($self->{"handler_permission"}->{$action}==2){
569                 my $login = $self->get_login_info();
570                 if(!defined($login)){
571                         return $self->error(RC_FORBIDDEN, "¥í¥°¥¤¥ó¤·¤Æ¤¤¤Þ¤»¤ó¡£");
572                 }
573                 return $obj->do_action($self).
574                        "<div class=\"comment\"><a href=\"".$self->create_url({action=>"LOGIN"})."\">¥á¥Ë¥å¡¼¤ËÌá¤ë</a></div>";
575                 
576         # ÉáÄ̤Υ¢¥¯¥·¥ç¥ó
577         } else {
578                 return $obj->do_action($self);
579         }
580 }
581
582 #===============================================================================
583 # <p>
584 # °ú¿ô¤ÇÅϤ·¤¿Wiki¥Õ¥©¡¼¥Þ¥Ã¥È¤Îʸ»úÎó¤òHTML¤ËÊÑ´¹¤·¤ÆÊÖ¤·¤Þ¤¹¡£
585 # </p>
586 # <pre>
587 # my $html = $wiki-&gt;process_wiki(ʸ»úÎó);
588 # </pre>
589 #===============================================================================
590 sub process_wiki {
591         my $self    = shift;
592         my $source  = shift;
593         my $mainflg = shift;
594         
595         if($self->{parse_times} >= 50){
596                 return $self->error("Wiki::process_wiki¤Î¸Æ¤Ó½Ð¤·²ó¿ô¤¬¾å¸Â¤ò±Û¤¨¤Þ¤·¤¿¡£");
597         }
598         
599         $self->{parse_times}++;
600         my $parser = Wiki::HTMLParser->new($self,$mainflg);
601         $parser->parse($source);
602         $self->{parse_times}--;
603         
604         return $parser->{html};
605 }
606
607 #===============================================================================
608 # <p>
609 # ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¡¢¥Ñ¥é¥°¥é¥Õ¥×¥é¥°¥¤¥ó¤Î¸Æ¤Ó½Ð¤·¡ÊÆâÉô½èÍýÍѤδؿô¡Ë¡£
610 # ½é´ü¤Î¥á¥½¥Ã¥É¤Î¤¿¤á̿̾µ¬Â§¡Êprivate¥á¥½¥Ã¥É¤Î¥á¥½¥Ã¥É̾¤Ï_¤«¤é»Ï¤á¤ë¡Ë
611 # ¤Ë½¾¤Ã¤Æ¤¤¤Þ¤»¤ó¡£
612 # </p>
613 #===============================================================================
614 sub process_plugin {
615         my $self   = shift;
616         my $plugin = shift;
617         my $parser = shift;
618         
619         if(defined($plugin->{error}) && $plugin->{error} ne ""){
620                 return "<font class=\"error\">".$plugin->{error}."</font>";
621         }
622
623         my $name = $plugin->{command};
624         my @args = @{$plugin->{args}};
625         my $info = $self->get_plugin_info($name);
626         my $obj  = $self->get_plugin_instance($info->{CLASS});
627
628         if(!defined($obj)){
629                 return "<font class=\"error\">".&Util::escapeHTML($name)."¥×¥é¥°¥¤¥ó¤Ï¸ºß¤·¤Þ¤»¤ó¡£</font>";
630                 
631         } else {
632                 if($info->{FORMAT} eq "WIKI"){
633                         # Î¢µ»ÍÑ(¥×¥é¥°¥¤¥óÆâÉô¤«¤é¥Ñ¡¼¥µ¤ò»È¤¦¾ì¹ç)
634                         push(@{$self->{'current_parser'}}, $parser);
635                         if($info->{TYPE} eq "inline"){
636                                 my @result = $parser->parse_line($obj->inline($self,@args));
637                                 pop(@{$self->{'current_parser'}});
638                                 return @result;
639                         } elsif($info->{TYPE} eq "paragraph"){
640                                 $parser->parse($obj->paragraph($self,@args));
641                         } else {
642                                 $parser->parse($obj->block($self,@args));
643                         }
644                         # ¥Ñ¡¼¥µ¤Î»²¾È¤ò²òÊü
645                         pop(@{$self->{'current_parser'}});
646                         return undef;
647                 } else {
648                         if($info->{TYPE} eq "inline"){
649                                 return $obj->inline($self,@args);
650                         } elsif($info->{TYPE} eq "paragraph"){
651                                 return $obj->paragraph($self,@args);
652                         } else {
653                                 return $obj->block($self,@args);
654                         }
655                 }
656         }
657 }
658
659 #==============================================================================
660 # <p>
661 # ¥Ñ¡¼¥¹Ãæ¤Î¾ì¹ç¡¢¸½ºßÍ­¸ú¤ÊWiki::Parser¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÊֵѤ·¤Þ¤¹¡£
662 # ¥Ñ¡¼¥¹Ãæ¤ÎÆâÍƤò¥×¥é¥°¥¤¥ó¤«¤éÊѹ¹¤·¤¿¤¤¾ì¹ç¤Ë»ÈÍѤ·¤Þ¤¹¡£
663 # </p>
664 #==============================================================================
665 sub get_current_parser {
666         my $self = shift;
667         my @parsers = @{$self->{'current_parser'}};
668         return $parsers[$#parsers];
669 }
670
671 #==============================================================================
672 # <p>
673 # ¥¨¥é¡¼¤Î¾ì¹ç¡¢¸Æ¤Ó½Ð¤·¤Þ¤¹¡£
674 # ¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¤«¤é¥¨¥é¡¼¤òÊó¹ð¤¹¤ëºÝ¤Ë»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£
675 # </p>
676 # <pre>
677 # sub do_action {
678 #   my $self = shift;
679 #   my $wiki = shift;
680 #   ...
681 #   return $wiki-&gt;error(¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸);
682 #     or
683 #   return $wiki-&gt;error(¥¨¥é¡¼¥³¡¼¥É, ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸);
684 # }
685 # </pre>
686 #==============================================================================
687 sub error {
688         my $self    = shift;
689         my $status = shift;
690         my $message = shift;
691         
692         if(!defined($message)){
693                 $message = $status;
694                 $status = undef;
695         } else {
696                 printf "Status: %d\n", $status;
697         }
698         
699         $self->set_title("¥¨¥é¡¼");
700         $self->get_CGI->param("action","ERROR");
701         
702         return "<div class=\"error\">".Util::escapeHTML($message)."</div>";
703 }
704
705 #===============================================================================
706 # <p>
707 # ¥×¥é¥°¥¤¥ó¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¼èÆÀ¤·¤Þ¤¹¡£Wiki.pm¤ÇÆâÉôŪ¤Ë»ÈÍѤµ¤ì¤ë¥á¥½¥Ã¥É¤Ç¤¹¡£
708 # ¥×¥é¥°¥¤¥ó³«È¯¤Ë¤ª¤¤¤ÆÄ̾¤³¤Î¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£
709 # </p>
710 #===============================================================================
711 sub get_plugin_instance {
712         my $self  = shift;
713         my $class = shift;
714         
715         if($class eq ""){
716                 return undef;
717         }
718         
719         if(!defined($self->{instance}->{$class})){
720                 eval {
721                         require &Util::get_module_file($class);
722                 };
723                 return undef if $@;
724                 my $obj = $class->new();
725                 $self->{instance}->{$class} = $obj;
726                 
727                 return $obj;
728         } else {
729                 return $self->{instance}->{$class};
730         }
731 }
732
733 #===============================================================================
734 # <p>
735 # ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤ò¥Ñ¡¼¥¹¤·¤Æ¥³¥Þ¥ó¥É¤È°ú¿ô¤Ëʬ³ä¤·¤Þ¤¹¡£
736 # </p>
737 #===============================================================================
738 sub parse_inline_plugin {
739         my $self = shift;
740         my $text = shift;
741         my ($cmd, @args_tmp) = split(/ /,$text);
742         my $args_txt = &Util::trim(join(" ",@args_tmp));
743         if($cmd =~ s/\}\}(.*?)$//){
744                 return { command=>$cmd, args=>[], post=>"$1 $args_txt"};
745         }
746         
747         my @ret_args;
748         my $tmp    = "";
749         my $escape = 0;
750         my $quote  = 0;
751         my $i      = 0;
752         
753         for($i = 0; $i<length($args_txt); $i++){
754                 my $c = substr($args_txt,$i,1);
755                 if($quote!=1 && $c eq ","){
756                         if($quote==3){
757                                 $tmp .= '}';
758                         }
759                         push(@ret_args,$tmp);
760                         $tmp = "";
761                         $quote = 0;
762                 } elsif($quote==1 && $c eq "\\"){
763                         if($escape==0){
764                                 $escape = 1;
765                         } else {
766                                 $tmp .= $c;
767                                 $escape = 0;
768                         }
769                 } elsif($quote==0 && $c eq '"'){
770                         if($tmp eq ""){
771                                 $quote = 1;
772                         } else {
773                                 $tmp .= $c;
774                         }
775                 } elsif($quote==1 && $c eq '"'){
776                         if($escape==1){
777                                 $tmp .= $c;
778                                 $escape = 0;
779                         } else {
780                                 $quote = 2;
781                         }
782                 } elsif(($quote==0 || $quote==2) && $c eq '}'){
783                         $quote = 3;
784                 } elsif($quote==3){
785                         if($c eq '}'){
786                                 last;
787                         } else {
788                                 $tmp .= '}'.$c;
789                                 $quote = 0;
790                         }
791                 } elsif($quote==2){
792                         return {error=>"¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤Î¹½Ê¸¤¬ÉÔÀµ¤Ç¤¹¡£"};
793                 } else {
794                         $tmp .= $c;
795                         $escape = 0;
796                 }
797         }
798         
799         if($quote!=3){
800                 my $info = $self->get_plugin_info($cmd);
801                 return undef if (defined($info->{TYPE}) && $info->{TYPE} ne 'block');
802         }
803         
804         if($tmp ne ""){
805                 push(@ret_args,$tmp);
806         }
807         
808         return { command=>$cmd, args=>\@ret_args, 
809                 post=>substr($args_txt, $i + 1, length($args_txt) - $i)};
810 }
811
812 #==============================================================================
813 # <p>
814 # ¥Õ¥©¡¼¥Þ¥Ã¥È¥×¥é¥°¥¤¥ó¤òÄɲä·¤Þ¤¹¡£
815 # ¥Õ¥©¡¼¥Þ¥Ã¥È¥×¥é¥°¥¤¥ó¤Ïconvert_to_fswiki¥á¥½¥Ã¥É¤Èconvert_from_fswiki¥á¥½¥Ã¥É¤ò
816 # ¼ÂÁõ¤·¤¿¥¯¥é¥¹¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£
817 # </p>
818 # <pre>
819 # $wiki-&gt;add_format_plugin(ʸˡ̾,¥¯¥é¥¹Ì¾);
820 # </pre>
821 #==============================================================================
822 sub add_format_plugin {
823         my $self  = shift;
824         my $name  = shift;
825         my $class = shift;
826         
827         $self->{'format'}->{$name} = $class;
828 }
829
830 #==============================================================================
831 # <p>
832 # ¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¥Õ¥©¡¼¥Þ¥Ã¥È¥×¥é¥°¥¤¥ó¤Î°ìÍ÷¤ò¼èÆÀ¤·¤Þ¤¹¡£
833 # </p>
834 # <pre>
835 # my @formats = $wiki-&gt;get_format_names();
836 # </pre>
837 #==============================================================================
838 sub get_format_names {
839         my $self = shift;
840         my @list = keys(%{$self->{'format'}});
841         if(!scalar(@list)){
842                 push(@list, "FSWiki");
843         }
844         return sort(@list);
845 }
846
847 #==============================================================================
848 # <p>
849 # ³ÆWiki½ñ¼°¤Çµ­½Ò¤·¤¿¥½¡¼¥¹¤òFSWiki¤Î½ñ¼°¤ËÊÑ´¹¤·¤Þ¤¹¡£
850 # </p>
851 # <pre>
852 # $source = $wiki-&gt;convert_to_fswiki($source,&quot;YukiWiki&quot;);
853 # </pre>
854 # <p>
855 # ¥¤¥ó¥é¥¤¥ó½ñ¼°¤Î¤ßÊÑ´¹¤ò¹Ô¤¦¾ì¹ç¤ÏÂè»°°ú¿ô¤Ë1¤òÅϤ·¤Þ¤¹¡£
856 # </p>
857 # <pre>
858 # $source = $wiki-&gt;convert_to_fswiki($source,&quot;YukiWiki&quot;,1);
859 # </pre>
860 #==============================================================================
861 sub convert_to_fswiki {
862         my $self   = shift;
863         my $source = shift;
864         my $type   = shift;
865         my $inline = shift;
866         
867         my $obj = $self->get_plugin_instance($self->{'format'}->{$type});
868         unless(defined($obj)){
869                 return $source;
870         } else {
871                 $source =~ s/\r\n/\n/g;
872                 $source =~ s/\r/\n/g;
873                 if($inline){
874                         return $obj->convert_to_fswiki_line($source);
875                 } else {
876                         return $obj->convert_to_fswiki($source);
877                 }
878         }
879 }
880
881 #==============================================================================
882 # <p>
883 # FSWiki¤Î½ñ¼°¤Çµ­½Ò¤·¤¿¥½¡¼¥¹¤ò³ÆWiki¤Î½ñ¼°¤ËÊÑ´¹¤·¤Þ¤¹¡£
884 # </p>
885 # <pre>
886 # $source = $wiki-&gt;convert_from_fswiki($source,&quot;YukiWiki&quot;);
887 # </pre>
888 # <p>
889 # ¥¤¥ó¥é¥¤¥ó½ñ¼°¤Î¤ßÊÑ´¹¤ò¹Ô¤¦¾ì¹ç¤ÏÂè»°°ú¿ô¤Ë1¤òÅϤ·¤Þ¤¹¡£
890 # </p>
891 # <pre>
892 # $source = $wiki-&gt;convert_from_fswiki($source,&quot;YukiWiki&quot;,1);
893 # </pre>
894 #==============================================================================
895 sub convert_from_fswiki {
896         my $self   = shift;
897         my $source = shift;
898         my $type   = shift;
899         my $inline = shift;
900         
901         my $obj = $self->get_plugin_instance($self->{'format'}->{$type});
902         unless(defined($obj)){
903                 return $source;
904         } else {
905                 $source =~ s/\r\n/\n/g;
906                 $source =~ s/\r/\n/g;
907                 if($inline){
908                         return $obj->convert_from_fswiki_line($source);
909                 } else {
910                         return $obj->convert_from_fswiki($source);
911                 }
912         }
913 }
914
915 #==============================================================================
916 # <p>
917 # ¸½ºß¤Î¥æ¡¼¥¶¤¬ÊÔ½¸¤Ë»ÈÍѤ¹¤ë¥Õ¥©¡¼¥Þ¥Ã¥È¤ò¼èÆÀ¤·¤Þ¤¹¡£
918 # format¥×¥é¥°¥¤¥ó¤¬¥¢¥¯¥Æ¥£¥Ù¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¾ï¤Ë"FSWiki"¤òÊÖ¤·¤Þ¤¹¡£
919 # </p>
920 # <pre>
921 # my $format = $wiki-&gt;get_edit_format();
922 # </pre>
923 #==============================================================================
924 sub get_edit_format {
925         my $self = shift;
926         my $from = shift;
927         
928         # format¥×¥é¥°¥¤¥ó¤¬¥¢¥¯¥Æ¥£¥Ù¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤ÐFSWiki¥Õ¥©¡¼¥Þ¥Ã¥È¤òÊÖ¤¹
929         unless($self->is_installed("format")){
930                 return "FSWiki";
931         }
932
933         #Ä̾ï¤Ï´Ä¶­ÀßÄê²èÌ̤ÇÀßÄꤷ¤¿Wiki¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ÈÍÑ
934         my $config = &Util::load_config_hash($self, $self->config('config_file'));
935         my $format = $config->{site_wiki_format};
936
937         # Cookie¤Ë¥Õ¥©¡¼¥Þ¥Ã¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¤½¤Á¤é¤ò»ÈÍÑ
938         #(⤷¡¢config.dat¥Õ¥¡¥¤¥ë¤«¤é¤Î¼èÆÀ»ØÄê»þ¤ÏCookie¤ò̵»ë)
939         if($from ne "config"){
940                 my $cgi = $self->get_CGI();
941                 if($cgi->cookie(-name=>'edit_format') ne ""){
942                         $format = $cgi->cookie(-name=>'edit_format');
943                 }
944         }
945
946         if($format eq ""){
947                 return "FSWiki";
948         } else {
949                 return $format;
950         }
951 }
952
953 #==============================================================================
954 # <p>
955 # head¥¿¥°Æâ¤Ë½ÐÎϤ¹¤ë¾ðÊó¤òÄɲä·¤Þ¤¹¡£
956 # ¤¿¤À¤·¥µ¥¤¥È¥Æ¥ó¥×¥ì¡¼¥È¤¬Âбþ¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
957 # </p>
958 # <pre>
959 # $wiki-&gt;add_head_info(&quot;<link rel=\&quot;alternate\&quot; type=\&quot;application/rss+xml\&quot; title=\&quot;RSS\&quot; href=\&quot;?action=RSS\&quot;>&quot;);
960 # </pre>
961 #==============================================================================
962 sub add_head_info {
963         my $self = shift;
964         my $info = shift;
965         
966         push(@{$self->{'head_info'}},$info);
967 }
968
969 ###############################################################################
970 #
971 # Åà·ë¤Ë´Ø¤¹¤ë¥á¥½¥Ã¥É·²
972 #
973 ###############################################################################
974 #==============================================================================
975 # <p>
976 # ¥Ú¡¼¥¸¤òÅà·ë¤·¤Þ¤¹
977 # </p>
978 # <pre>
979 # $wiki-&gt;freeze_page(¥Ú¡¼¥¸Ì¾);
980 # </pre>
981 #==============================================================================
982 sub freeze_page {
983         my $self = shift;
984         $self->{"storage"}->freeze_page(@_);
985 }
986
987 #==============================================================================
988 # <p>
989 # ¥Ú¡¼¥¸¤ÎÅà·ë¤ò²ò½ü¤·¤Þ¤¹
990 # </p>
991 # <pre>
992 # $wiki-&gt;un_freeze_page(¥Ú¡¼¥¸Ì¾);
993 # </pre>
994 #==============================================================================
995 sub un_freeze_page {
996         my $self = shift;
997         $self->{"storage"}->un_freeze_page(@_);
998 }
999
1000 #==============================================================================
1001 # <p>
1002 # Åà·ë¤µ¤ì¤Æ¤¤¤ë¥Ú¡¼¥¸¤Î¥ê¥¹¥È¤ò¼èÆÀ¤·¤Þ¤¹¡£
1003 # </p>
1004 #==============================================================================
1005 sub get_freeze_list {
1006         my $self = shift;
1007         return $self->{"storage"}->get_freeze_list();
1008 }
1009
1010 #==============================================================================
1011 # <p>
1012 # °ú¿ô¤ÇÅϤ·¤¿¥Ú¡¼¥¸¤¬Åà·ëÃ椫¤É¤¦¤«¤·¤é¤Ù¤Þ¤¹
1013 # </p>
1014 # <pre>
1015 # if($wiki-&gt;is_freeze(¥Ú¡¼¥¸Ì¾)){
1016 #   ...
1017 # }
1018 # </pre>
1019 #==============================================================================
1020 sub is_freeze {
1021         my $self = shift;
1022         my $page = shift;
1023         my $path = undef;
1024         
1025         if($page =~ /(^.*?[^:]):([^:].*?$)/){
1026                 $path = $1;
1027                 $page = $2;
1028         }
1029         
1030         return $self->{storage}->is_freeze($page,$path);
1031 }
1032
1033 #==============================================================================
1034 # <p>
1035 # °ú¿ô¤ÇÅϤ·¤¿¥Ú¡¼¥¸¤¬ÊÔ½¸²Äǽ¤«¤É¤¦¤«¤òÄ´¤Ù¤Þ¤¹¡£
1036 # ÊÔ½¸ÉԲĥ⡼¥É¡Êsetup.pl¤Ç$accept_edit¤¬0¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡Ë¤Ï¥í¥°¥¤¥ó¤·¤Æ¤¤¤ì¤ÐÊÔ½¸²Äǽ¡¢
1037 # ¥Ú¡¼¥¸¤¬Åà·ë¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï´ÉÍý¼Ô¥æ¡¼¥¶¤Ç¥í¥°¥¤¥ó¤·¤Æ¤¤¤ë¾ì¹ç¤ËÊÔ½¸²Äǽ¤È¤Ê¤ê¤Þ¤¹¡£
1038 # </p>
1039 # <pre>
1040 # if($wiki-&gt;can_modify_page(¥Ú¡¼¥¸Ì¾)){
1041 #   ...
1042 # }
1043 # </pre>
1044 #==============================================================================
1045 sub can_modify_page {
1046         my $self = shift;
1047         my $page = shift;
1048         my $login = $self->get_login_info();
1049         if($self->config('accept_edit')==0 && !defined($login)){
1050                 return 0;
1051         }
1052         if($self->config('accept_edit')==2 && (!defined($login) || $login->{type}!=0)){
1053                 return 0;
1054         }
1055         if($self->is_freeze($page) && (!defined($login) || $login->{type}!=0)){
1056                 return 0;
1057         }
1058         unless($self->can_show($page)){
1059                 return 0;
1060         }
1061         return 1;
1062 }
1063
1064 ###############################################################################
1065 #
1066 # »²¾È¸¢¸Â¤Ë´Ø¤¹¤ë¥á¥½¥Ã¥É·²
1067 #
1068 ###############################################################################
1069 #==============================================================================
1070 # <p>
1071 # ¥Ú¡¼¥¸¤Î»²¾È¥ì¥Ù¥ë¤òÀßÄꤷ¤Þ¤¹¡£
1072 # <p>
1073 # <ul>
1074 #   <li>0 - Á´°÷¤Ë¸ø³«</li>
1075 #   <li>1 - ¥æ¡¼¥¶¤Ë¸ø³«</li>
1076 #   <li>2 - ´ÉÍý¼Ô¤Ë¸ø³«</li>
1077 # </ul>
1078 # <pre>
1079 # $wiki-&gt;set_page_level(¥Ú¡¼¥¸Ì¾,¸ø³«¥ì¥Ù¥ë);
1080 # </pre>
1081 #==============================================================================
1082 sub set_page_level {
1083         my $self  = shift;
1084         my $page  = shift;
1085         my $level = shift;
1086
1087         $self->{"storage"}->set_page_level($page,$level);
1088
1089         # $level ¤¬Ì¤ÄêµÁ¤Ê¤é¥Ú¡¼¥¸¥Ç¡¼¥¿ºï½ü¤Ê¤Î¤Ç¡¢¥Õ¥Ã¥¯´ØÏ¢½èÍýÉÔÍס£
1090         return if (not defined $level);
1091
1092         # ½èÍý¤ÎÀ®Èݤò¸¡ºº¡£
1093         my $new_level = $self->get_page_level($page);
1094         if ($new_level != $level) {
1095                 die "¥Ú¡¼¥¸ '$page' ¤Î»²¾È¸¢¸Â¥ì¥Ù¥ë¤ò '$level' ¤ËÊѹ¹¤·¤è¤¦¤È¤·¤Þ¤·¤¿¤¬¼ºÇÔ¤·¤Þ¤·¤¿¡£";
1096         }
1097
1098         # ¥Ú¡¼¥¸¥ì¥Ù¥ë¤ÎÊѹ¹¤ËÀ®¸ù¤·¤¿¤Î¤Ç¡¢¥Õ¥Ã¥¯¤òȯ¹Ô¡£
1099         $self->do_hook('change_page_level', $page, $new_level);
1100 }
1101
1102 #==============================================================================
1103 # <p>
1104 # ¥Ú¡¼¥¸¤Î»²¾È¥ì¥Ù¥ë¤ò¼èÆÀ¤·¤Þ¤¹¡£
1105 # ¥Ú¡¼¥¸Ì¾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢Á´¤Æ¤Î¥Ú¡¼¥¸¤Î»²¾È¥ì¥Ù¥ë¤ò
1106 # ¥Ï¥Ã¥·¥å¥ê¥Õ¥¡¥ì¥ó¥¹¤ÇÊÖ¤·¤Þ¤¹¡£
1107 # </p>
1108 # <ul>
1109 #   <li>0 - Á´°÷¤Ë¸ø³«</li>
1110 #   <li>1 - ¥æ¡¼¥¶¤Ë¸ø³«</li>
1111 #   <li>2 - ´ÉÍý¼Ô¤Ë¸ø³«</li>
1112 # </ul>
1113 # <pre>
1114 # my $level = $get_page_level(¥Ú¡¼¥¸Ì¾);
1115 # </pre>
1116 #==============================================================================
1117 sub get_page_level {
1118         my $self  = shift;
1119         my $page  = shift;
1120         my $path  = undef;
1121         
1122         if($page =~ /(^.*?[^:]):([^:].*?$)/){
1123                 $path = $1;
1124                 $page = $2;
1125         }
1126         
1127         $self->{"storage"}->get_page_level($page,$path);
1128 }
1129
1130 #==============================================================================
1131 # <p>
1132 # ¸½ºß¤Î¥æ¡¼¥¶¸¢¸Â¤Ç±ÜÍ÷²Äǽ¤Ê¥Ú¡¼¥¸¥ì¥Ù¥ë¤Î¾å¸ÂÃͤòµá¤á¤Þ¤¹¡£
1133 # </p>
1134 # <pre>
1135 # my $can_show_max = $wiki-&gt;_get_can_show_max();
1136 # </pre>
1137 #==============================================================================
1138 sub _get_can_show_max {
1139         my $self = shift;
1140
1141         # ¡Ö±ÜÍ÷²Äǽ¤Ê page level ¤Î¾å¸ÂÃ͡פ¬´ûÃΤʤé¤Ð¡¢¤½¤ì¤òÊֵѡ£
1142         if (exists $self->{'can_show_max'}) {
1143                 return $self->{'can_show_max'};
1144         }
1145
1146         # Wiki Á´ÂΤαÜÍ÷¸¢¸Â¤ÎÀßÄêÃͤȡ¢±ÜÍ÷¼Ô¤Î¥æ¡¼¥¶¸¢¸Â¥ì¥Ù¥ë¤òµá¤á¤ë¡£
1147         my $accept_show = $self->config('accept_show'); # Wiki Á´ÂΤαÜÍ÷¸¢¸Â
1148         my $login_user  = $self->get_login_info();      # ¸½ºß¤Î login ¾ðÊó
1149         my $user_level                                  # ¥æ¡¼¥¶¸¢¸Â¥ì¥Ù¥ë
1150                 = (not defined $login_user)  ? 0            #   Èó¥í¥°¥¤¥ó¥æ¡¼¥¶
1151                 : ($login_user->{type} != 0) ? 1            #   ¥í¥°¥¤¥ó¥æ¡¼¥¶
1152                 :                              2;           #   ´ÉÍý¼Ô
1153
1154         # Wiki Á´ÂΤαÜÍ÷¸¢¸Â¤Ë㤷¤Æ¤¤¤ë¥æ¡¼¥¶¤Ê¤é¡¢
1155         if ($user_level >= $accept_show) {
1156                 # ¡Ö±ÜÍ÷²Äǽ¤Ê page level ¾å¸ÂÃ͡פϡ¢¥æ¡¼¥¶¸¢¸Â¥ì¥Ù¥ë¤ËÅù¤·¤¤¡£
1157                 return $self->{'can_show_max'} = $user_level;
1158         }
1159
1160         # Wiki Á´ÂΤαÜÍ÷¸¢¸Â¤Ë㤷¤Æ¤¤¤Ê¤¤¥æ¡¼¥¶¤Ê¤Î¤Ç¡¢
1161         # ¡Ö±ÜÍ÷²Äǽ¤Ê page level ¾å¸ÂÃ͡פϠ-1¡£¤¹¤Ê¤ï¤Á¡¢Á´¥Ú¡¼¥¸±ÜÍ÷ÉԲġ£
1162         return $self->{'can_show_max'} = -1;
1163 }
1164
1165 #==============================================================================
1166 # <p>
1167 # ¥Ú¡¼¥¸¤¬»²¾È²Äǽ¤«¤É¤¦¤«¤ò¼èÆÀ¤·¤Þ¤¹¡£
1168 # </p>
1169 # <pre>
1170 # if($wiki-&gt;can_show(¥Ú¡¼¥¸Ì¾)){
1171 #   # »²¾È²Äǽ
1172 # } else {
1173 #   # »²¾ÈÉÔ²Äǽ
1174 # }
1175 # </pre>
1176 #==============================================================================
1177 sub can_show {
1178         my ($self, $page) = @_;
1179
1180         #¡Ö±ÜÍ÷²Äǽ page level ¾å¸Â¡×¤¬Ì¤ÃΤʤé¤Ð¡¢µá¤á¤ë¡£
1181         if (not exists $self->{'can_show_max'}) {
1182                 $self->_get_can_show_max();
1183         }
1184
1185         # page level ¤¬¡¢±ÜÍ÷²Äǽ page level ¾å¸Â°Ê²¼¤Ê¤é¿¿¤òÊÖ¤¹¡£
1186         return ($self->get_page_level($page) <= $self->{'can_show_max'});
1187 }
1188
1189 ###############################################################################
1190 #
1191 # ¤½¤Î¾¤Î¥á¥½¥Ã¥É·²
1192 #
1193 ###############################################################################
1194 #==============================================================================
1195 # <p>
1196 # ¥Ú¡¼¥¸¤Ë¥¸¥ã¥ó¥×¤¹¤ë¤¿¤á¤ÎURL¤òÀ¸À®¤¹¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£¥á¥½¥Ã¥É¤Ç¤¹¡£
1197 # °ú¿ô¤È¤·¤Æ¥Ú¡¼¥¸Ì¾¤òÅϤ·¤Þ¤¹¡£
1198 # </p>
1199 # <pre>
1200 # $wiki-&gt;create_page_url(&quot;FrontPage&quot;);
1201 # </pre>
1202 # <p>
1203 # ¾åµ­¤Î¥³¡¼¥É¤ÏÄ̾°Ê²¼¤ÎURL¤òÀ¸À®¤·¤Þ¤¹¡£
1204 # </p>
1205 # <pre>
1206 # wiki.cgi?page=FrontPage
1207 # </pre>
1208 #==============================================================================
1209 sub create_page_url {
1210         my $self = shift;
1211         my $page = shift;
1212         return $self->create_url({page=>$page});
1213 }
1214
1215 #==============================================================================
1216 # <p>
1217 # Ç¤°Õ¤ÎURL¤òÀ¸À®¤¹¤ë¤¿¤á¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¥á¥½¥Ã¥É¤Ç¤¹¡£
1218 # °ú¿ô¤È¤·¤Æ¥Ñ¥é¥á¡¼¥¿¤Î¥Ï¥Ã¥·¥å¥ê¥Õ¥¡¥ì¥ó¥¹¤òÅϤ·¤Þ¤¹¡£
1219 # </p>
1220 # <pre>
1221 # $wiki-&gt;create_url({action=>HOGE,type=>1});
1222 # </pre>
1223 # <p>
1224 # ¾åµ­¤Î¥³¡¼¥É¤ÏÄ̾°Ê²¼¤ÎURL¤òÀ¸À®¤·¤Þ¤¹¡£
1225 # </p>
1226 # <pre>
1227 # wiki.cgi?action=HOGE&amp;type=1
1228 # </pre>
1229 #==============================================================================
1230 sub create_url {
1231         my $self   = shift;
1232         my $params = shift;
1233         my $url    = $self->config('script_name');
1234         my $query  = '';
1235         foreach my $key (keys(%$params)){
1236                 if($query ne ''){
1237                         $query .= '&amp;';
1238                 }
1239                 $query .= Util::url_encode($key)."=".Util::url_encode($params->{$key});
1240         }
1241         if($query ne ''){
1242                 $url .= '?'.$query; 
1243         }
1244         return $url;
1245 }
1246
1247 #==============================================================================
1248 # <p>
1249 # ¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥éÃæ¤Ç¥¿¥¤¥È¥ë¤òÀßÄꤹ¤ë¾ì¹ç¤Ë»ÈÍѤ·¤Þ¤¹¡£
1250 # </p>
1251 # <pre>
1252 # $wiki-&gt;set_title(¥¿¥¤¥È¥ë[,ÊÔ½¸·Ï¤Î¥Ú¡¼¥¸¤¬¤É¤¦¤«]);
1253 # </pre>
1254 # <p>
1255 # ÊÔ½¸·Ï¤Î²èÌ̤ξì¹ç¡¢ÂèÆó°ú¿ô¤Ë1¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£
1256 # ¥í¥Ü¥Ã¥ÈÂкöÍѤ˰ʲ¼¤ÎMETA¥¿¥°¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£
1257 # </p>
1258 # <pre>
1259 # &lt;meta name=&quot;ROBOTS&quot; content=&quot;NOINDEX, NOFOLLOW&quot;&gt;
1260 # </pre>
1261 #==============================================================================
1262 sub set_title {
1263         my $self  = shift;
1264         my $title = shift;
1265         my $edit  = shift;
1266         $self->{"title"} = $title;
1267         $self->{"edit"}  = 1 if $edit;
1268 }
1269
1270 #==============================================================================
1271 # <p>
1272 # ¥¿¥¤¥È¥ë¤ò¼èÆÀ¤·¤Þ¤¹¡£
1273 # </p>
1274 #==============================================================================
1275 sub get_title {
1276         my $self = shift;
1277         return $self->{"title"};
1278 }
1279
1280 #==============================================================================
1281 # <p>
1282 # ¥Ú¡¼¥¸¤Î°ìÍ÷¤ò¼èÆÀ¤·¤Þ¤¹¡£
1283 # °ú¿ô¤È¤·¤Æ¥Ï¥Ã¥·¥å¥ê¥Õ¥¡¥ì¥ó¥¹¤òÅϤ¹¤³¤È¤Ç¼èÆÀÆâÍƤò»ØÄꤹ¤ë¤³¤È¤¬²Äǽ¡£
1284 # ¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏÁ´¤Æ¤Î¥Ú¡¼¥¸¤ò̾Á°¤Ç¥½¡¼¥È¤·¤¿¥ê¥¹¥È¤òÊֵѤ¹¤ë¡£
1285 # </p>
1286 # <p>
1287 # °Ê²¼¤ÎÎã¤Ï»²¾È¸¢¤Î¤¢¤ë¥Ú¡¼¥¸¤Î¤ß¼èÆÀ¤·¡¢¹¹¿·Æü»þ¤Ç¥½¡¼¥È¤¹¤ë¡£
1288 # </p>
1289 # <pre>
1290 # my @list = $wiki-&gt;get_page_list({-sort   => 'last_modified',
1291 #                                  -permit => 'show'});
1292 # </pre>
1293 # <p>
1294 # °Ê²¼¤ÎÎã¤ÏÁ´¤Æ¤Î¥Ú¡¼¥¸¤ò¼èÆÀ¤·¡¢Ì¾Á°¤Ç¥½¡¼¥È¤¹¤ë¡£
1295 # </p>
1296 # <pre>
1297 # my @list = $wiki-&gt;get_page_list({-sort => 'name'});
1298 # </pre>
1299 # <p>
1300 # °Ê²¼¤ÎÎã¤ÏºÇ¿·¤Î10·ï¤ò¼èÆÀ¤¹¤ë¡£
1301 # </p>
1302 # <pre>
1303 # my @list = $wiki-&gt;get_page_list({-sort=>'last_modified',-max=>10});
1304 # </pre>
1305 #==============================================================================
1306 sub get_page_list {
1307         my $self = shift;
1308         my $args = shift;
1309         
1310         return $self->{"storage"}->get_page_list($args);
1311
1312 }
1313
1314 #==============================================================================
1315 # <p>
1316 # ¥Ú¡¼¥¸¤ÎʪÍýŪ¤Ê¡Ê¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤Î¹¹¿·Æü»þ¡ËºÇ½ª¹¹¿·»þ¹ï¤ò¼èÆÀ¤·¤Þ¤¹¡£
1317 # </p>
1318 # <pre>
1319 # my $modified = $wiki-&gt;get_last_modified(¥Ú¡¼¥¸Ì¾);
1320 # </pre>
1321 #==============================================================================
1322 sub get_last_modified {
1323         my $self = shift;
1324         return $self->{"storage"}->get_last_modified(@_);
1325 }
1326
1327 #==============================================================================
1328 # <p>
1329 # ¥Ú¡¼¥¸ÏÀÍýŪ¤ÊºÇ½ª¹¹¿·»þ¹ï¤ò¼èÆÀ¤·¤Þ¤¹¡£
1330 # ¡Ö¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò¹¹¿·¤·¤Ê¤¤¡×¤Ë¥Á¥§¥Ã¥¯¤òÆþ¤ì¤Æ¥Ú¡¼¥¸¤òÊݸ¤·¤¿¾ì¹ç¤Ï
1331 # ¤³¤Î¥á¥½¥Ã¥É¤ÇÊÖ¤µ¤ì¤ëÆü»þ¤ÏÊݸÁ°¤Î¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£
1332 # </p>
1333 # <pre>
1334 # my $modified = $wiki-&gt;get_last_modified2(¥Ú¡¼¥¸Ì¾);
1335 # </pre>
1336 #==============================================================================
1337 sub get_last_modified2 {
1338         my $self = shift;
1339         return $self->{"storage"}->get_last_modified2(@_);
1340 }
1341
1342 #==============================================================================
1343 # <p>
1344 # ¥Ú¡¼¥¸¤Î¥½¡¼¥¹¤ò¼èÆÀ¤·¤Þ¤¹¡£
1345 # </p>
1346 # <p>
1347 # Âè»°°ú¿ô¤Ë¥Õ¥©¡¼¥Þ¥Ã¥È̾¤òÅϤ·¤¿¾ì¹ç¤Î¤ß¡¢¥Õ¥©¡¼¥Þ¥Ã¥È¥×¥é¥°¥¤¥ó¤Ë¤è¤ë
1348 # ¥½¡¼¥¹¤ÎÊÑ´¹¤ò¹Ô¤¤¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤ÏɬÍפ˱þ¤¸¤Æ¥×¥é¥°¥¤¥ó¦¤Ç
1349 # Wiki::convert_from_fswiki¥á¥½¥Ã¥É¤ò¸Æ¤ó¤ÇÊÑ´¹¤ò¹Ô¤¤¤Þ¤¹¡£
1350 # </p>
1351 #==============================================================================
1352 sub get_page {
1353         my $self   = shift;
1354         my $page   = shift;
1355         my $format = shift;
1356         my $path   = undef;
1357         
1358         if($page =~ /(^.*?[^:]):([^:].*?$)/){
1359                 $path = $1;
1360                 $page = $2;
1361         }
1362         
1363         my $content = $self->{"storage"}->get_page($page,$path);
1364         
1365         if($format eq "" || $format eq "FSWiki"){
1366                 return $content;
1367         } else {
1368                 return $self->convert_from_fswiki($content,$format);
1369         }
1370 }
1371
1372 #==============================================================================
1373 # <p>
1374 # ¥Ð¥Ã¥¯¥¢¥Ã¥×¤µ¤ì¤¿¥½¡¼¥¹¤ò¼èÆÀ¤·¤Þ¤¹¡£¥Ð¥Ã¥¯¥¢¥Ã¥×¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¶õʸ»úÎó¤òÊÖ¤·¤Þ¤¹¡£
1375 # À¤Âå¥Ð¥Ã¥¯¥¢¥Ã¥×¤ËÂбþ¤·¤¿¥¹¥È¥ì¡¼¥¸¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç¤ÏÂèÆó°ú¿ô¤Ë¼èÆÀ¤¹¤ëÀ¤Âå¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£
1376 # </p>
1377 # <pre>
1378 # # À¤Âå¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤¾ì¹ç
1379 # my $backup = $wiki-&gt;get_backup(¥Ú¡¼¥¸Ì¾);
1380 #
1381 # # À¤Âå¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç
1382 # my $backup = $wiki-&gt;get_backup(¥Ú¡¼¥¸Ì¾,À¤Âå);
1383 # </pre>
1384 # <p>
1385 # À¤Âå¤Ï¸Å¤¤¤â¤Î¤«¤é½ç¤Ë0¡Á¤Î¿ôÃͤǻØÄꤷ¤Þ¤¹¡£
1386 # </p>
1387 #==============================================================================
1388 sub get_backup {
1389         my $self = shift;
1390         return $self->{"storage"}->get_backup(@_);
1391 }
1392
1393 #==============================================================================
1394 # <p>
1395 # ¥Ú¡¼¥¸¤òÊݸ¤·¤Þ¤¹¡£
1396 # </p>
1397 # <pre>
1398 # $wiki-&gt;save_page(¥Ú¡¼¥¸Ì¾,¥Ú¡¼¥¸ÆâÍÆ);
1399 # </pre>
1400 # <p>
1401 # ¥Õ¥©¡¼¥Þ¥Ã¥È¥×¥é¥°¥¤¥ó¤Ë¤è¤ë¥Õ¥©¡¼¥Þ¥Ã¥È¤ÎÊÑ´¹¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£
1402 # ¤Ä¤Þ¤ê¡¢¥Õ¥©¡¼¥Þ¥Ã¥È¥×¥é¥°¥¤¥ó¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç¡¢¤³¤Î¥á¥½¥Ã¥É¤ËÅϤ¹
1403 # Wiki¥½¡¼¥¹¤Ï»öÁ°¤ËFSWiki·Á¼°¤ËÊÑ´¹¤µ¤ì¤¿¥½¡¼¥¹¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
1404 # </p>
1405 # <p>
1406 # Êݸ»þ¤Ë¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò¹¹¿·¤·¤Ê¤¤¾ì¹ç¡¢Âè»°°ú¿ô¤Ë1¤òÅϤ·¤Þ¤¹¡£
1407 # </p>
1408 # <pre>
1409 # $wiki-&gt;save_page(¥Ú¡¼¥¸Ì¾,¥Ú¡¼¥¸ÆâÍÆ,1);
1410 # </pre>
1411 #
1412 #==============================================================================
1413 sub save_page {
1414         my $self     = shift;
1415         my $pagename = shift;
1416         my $content  = shift;
1417         my $sage     = shift;
1418         
1419         # ¥Ú¡¼¥¸Ì¾¤ò¥Á¥§¥Ã¥¯
1420         if(!Util::check_pagename($pagename)){
1421                 die "¥Ú¡¼¥¸Ì¾¤Ë»ÈÍѤǤ­¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£";
1422         }
1423         # ¤¤¤Ã¤¿¤ó¥Ñ¥é¥á¡¼¥¿¤ò¾å½ñ¤­
1424         $self->get_CGI->param("page"   ,$pagename);
1425         $self->get_CGI->param("content",$content);
1426         $self->do_hook("save_before");
1427         # ¥Ñ¥é¥á¡¼¥¿¤òÆɤ߹þ¤ßľ¤¹
1428         $content = $self->get_CGI()->param("content");
1429         
1430         if($self->{"storage"}->save_page($pagename,$content,$sage)){
1431                 if($content ne ""){
1432                         $self->do_hook("save_after");
1433                 } else {
1434                         $self->do_hook("delete");
1435                 }
1436         }
1437 }
1438
1439 #===============================================================================
1440 # <p>
1441 # ¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«Ä´¤Ù¤Þ¤¹¡£
1442 # </p>
1443 # <pre>
1444 # if($wiki-&gt;page_exists(¥Ú¡¼¥¸Ì¾)){
1445 #   # ¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Î½èÍý
1446 # } else {
1447 #   # ¥Ú¡¼¥¸¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Î½èÍý
1448 # }
1449 # </pre>
1450 #===============================================================================
1451 sub page_exists {
1452         my $self = shift;
1453         my $page = shift;
1454         my $path = undef;
1455         
1456         if($page =~ /(^.*?[^:]):([^:].*?$)/){
1457                 $path = $1;
1458                 $page = $2;
1459         }
1460         
1461         # InterWiki·Á¼°¤Î»ØÄê¤Ç¥É¥Ã¥È¤ò´Þ¤à¤³¤È¤Ï¤Ç¤­¤Ê¤¤
1462         if(defined($path) && index($path,".")!=-1){
1463                 return 0;
1464         }
1465         
1466         return $self->{"storage"}->page_exists($page,$path);
1467 }
1468
1469 #===============================================================================
1470 # <p>
1471 # CGI¥ª¥Ö¥¸¥§¥¯¥È¤ò¼èÆÀ
1472 # </p>
1473 # <pre>
1474 # my $cgi = $wiki-&gt;get_CGI;
1475 # </pre>
1476 #===============================================================================
1477 sub get_CGI {
1478         my $self = shift;
1479         return $self->{"CGI"};
1480 }
1481
1482 #==============================================================================
1483 # <p>
1484 # °ú¿ô¤ÇÅϤ·¤¿¥Ú¡¼¥¸¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£
1485 # ¥Ú¡¼¥¸¤ÎÊݸ¸å¤Ë¥Ú¡¼¥¸¤òºÆɽ¼¨¤¹¤ë¾ì¹ç¤Ï¤³¤Î¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤Æ²¼¤µ¤¤¡£
1486 # ¤Ê¤ª¡¢¤³¤Î¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹¤È¤½¤³¤Ç¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô¤Ï½ªÎ»¤·¡¢¸Æ¤Ó½Ð¤·¸µ¤ËÀ©¸æ¤ÏÌá¤ê¤Þ¤»¤ó¡£
1487 # </p>
1488 # <pre>
1489 # $wiki-&gt;redirect(&quot;FrontPage&quot;);
1490 # </pre>
1491 # <p>
1492 # ÂèÆó°ú¿ô¤Ë¥Ñ¡¼¥ÈÈÖ¹æ¤òÅϤ¹¤È¤½¤Î¥Ñ¡¼¥È¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£
1493 # </p>
1494 # <pre>
1495 # $wiki-&gt;redirect(&quot;FrontPage&quot;, 1);
1496 # </pre>
1497 #
1498 #==============================================================================
1499 sub redirect {
1500         my $self = shift;
1501         my $page = shift;
1502         my $part = shift;
1503         my $url = $self->create_page_url($page);
1504         if($part ne ""){
1505                 $url .= "#p".Util::url_encode($part);
1506         }
1507         $self->redirectURL($url);
1508 }
1509
1510 #==============================================================================
1511 # <p>
1512 # »ØÄê¤ÎURL¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£
1513 # ¤³¤Î¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹¤È¤½¤³¤Ç¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô¤Ï½ªÎ»¤·¡¢¸Æ¤Ó½Ð¤·¸µ¤ËÀ©¸æ¤ÏÌá¤ê¤Þ¤»¤ó¡£
1514 # </p>
1515 # <pre>
1516 # $wiki-&gt;redirectURL(¥ê¥À¥¤¥ì¥¯¥È¤¹¤ëURL);
1517 # </pre>
1518 #==============================================================================
1519 sub redirectURL {
1520         my $self = shift;
1521         my $url  = shift;
1522         
1523         # Location¥¿¥°¤Ç¥ê¥À¥¤¥ì¥¯¥È
1524         if($self->config('redirect')==1){
1525                 my ($hoge,$param) = split(/\?/,$url);
1526                 $url = $self->get_CGI->url().$self->get_CGI()->path_info();
1527                 if($param ne ''){
1528                         $url = "$url?$param";
1529                 }
1530                 print "Location: $url\n\n";
1531                 
1532         # META¥¿¥°¤Ç¥ê¥À¥¤¥ì¥¯¥È
1533         } else {
1534                 my $tmpl = HTML::Template->new(filename=>$self->config('tmpl_dir')."/redirect.tmpl",
1535                                                die_on_bad_params => 0);
1536                 
1537                 $tmpl->param(URL=>$url);
1538                 
1539                 print "Content-Type: text/html\n\n";
1540                 print $tmpl->output();
1541         }
1542         exit();
1543 }
1544
1545 #==============================================================================
1546 # <p>
1547 # ¥°¥í¡¼¥Ð¥ëÀßÄê¤ò¼èÆÀ¤â¤·¤¯¤ÏÊѹ¹¤·¤Þ¤¹
1548 # </p>
1549 # <pre>
1550 # # ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê
1551 # my $data_dir = $wiki-&gt;config('data_dir');
1552 #
1553 # # ÀßÄê¤ò$data_dir¤Ç¾å½ñ¤­
1554 # $wiki-&gt;config('data_dir',$data_dir);
1555 # </pre>
1556 #==============================================================================
1557 sub config {
1558         my $self  = shift;
1559         my $name  = shift;
1560         my $value = shift;
1561         if(defined($value)){
1562                 $self->{config}->{$name} = $value;
1563         } else {
1564                 return $self->{config}->{$name};
1565         }
1566 }
1567 ###############################################################################
1568 #
1569 # Farm´Ø·¸¤Î¥á¥½¥Ã¥É·²
1570 #
1571 ###############################################################################
1572 #==============================================================================
1573 # <p>
1574 # Farmµ¡Ç½¤¬Í­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤«¤É¤¦¤«¤ò¼èÆÀ¤·¤Þ¤¹
1575 # </p>
1576 # <pre>
1577 # if($wiki-&gt;farm_is_enable()){
1578 #   # Farm¤¬Í­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤È¤­¤Î½èÍý
1579 # } else {
1580 #   # Farm¤¬Ìµ¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤È¤­¤Î½èÍý
1581 # }
1582 # </pre>
1583 #==============================================================================
1584 sub farm_is_enable {
1585         my $self = shift;
1586         my $farm_config = &Util::load_config_hash($self,$self->config('farmconf_file'));
1587         if(defined $farm_config->{usefarm} and $farm_config->{usefarm}==1){
1588                 return 1;
1589         } else {
1590                 return 0;
1591         }
1592 }
1593
1594 #==============================================================================
1595 # <p>
1596 # »ÒWiki¤òºîÀ®¤·¤Þ¤¹¡£°ú¿ô¤Ë¤ÏWiki¤Î̾Á°¡¢ºîÀ®¤¹¤ëWiki¥µ¥¤¥È¤Î´ÉÍý¼ÔID¡¢¥Ñ¥¹¥ï¡¼¥É¤òÅϤ·¤Þ¤¹¡£
1597 # ¤³¤Î¥á¥½¥Ã¥ÉÆâ¤Ç¤ÏWiki¥µ¥¤¥È̾¤Î¥Ð¥ê¥Ç¡¼¥·¥ç¥ó¤ä½ÅÊ£¥Á¥§¥Ã¥¯¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£
1598 # »öÁ°¤Ë¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤Ïfarm¥×¥é¥°¥¤¥ó¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£
1599 # </p>
1600 # <pre>
1601 # $wiki-&gt;create_wiki(Wiki¥µ¥¤¥È̾,´ÉÍý¼ÔID,¥Ñ¥¹¥ï¡¼¥É);
1602 # </pre>
1603 #==============================================================================
1604 sub create_wiki{
1605         my $self  = shift;
1606         my $child = shift;
1607         my $id    = shift;
1608         my $pass  = shift;
1609         
1610         # data¡¢backup¥Ç¥£¥ì¥¯¥È¥ê¤ò·¡¤ë½èÍý¤ÏStorage¤ËǤ¤»¤¿¤Û¤¦¤¬¤¤¤¤¤«¤Ê¡©
1611         unless($self->wiki_exists($child)){
1612                 eval {
1613                         # ¥³¥¢¤Ç¥µ¥Ý¡¼¥È¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ò·¡¤ë
1614                         mkpath($self->config('data_dir'  )."/$child") or die $!;
1615                         mkpath($self->config('backup_dir')."/$child") or die $!;
1616                         mkpath($self->config('config_dir')."/$child") or die $!;
1617                         mkpath($self->config('log_dir'   )."/$child") or die $!;
1618                         
1619                         # ÀßÄê¤Î¥³¥Ô¡¼
1620                         copy($self->config('config_dir')."/".$self->config('config_file'),
1621                              $self->config('config_dir')."/$child/".$self->config('config_file')) or die $!;
1622                         copy($self->config('config_dir')."/".$self->config('usercss_file'),
1623                              $self->config('config_dir')."/$child/".$self->config('usercss_file')) or die $!;
1624                         copy($self->config('config_dir')."/".$self->config('plugin_file'),
1625                              $self->config('config_dir')."/$child/".$self->config('plugin_file')) or die $!;
1626                         copy($self->config('config_dir')."/".$self->config('mime_file'),
1627                              $self->config('config_dir')."/$child/".$self->config('mime_file')) or die $!;
1628                         
1629                         # ´ÉÍý¥æ¡¼¥¶¤ÎºîÀ®¡Ê¤³¤³¤Çºî¤ë¤Î¤Ï¤Á¤ç¤Ã¤È¥¢¥ì¤«¤â¡¦¡¦¡¦¡Ë
1630                         open(USERDAT,">".$self->config('config_dir')."/$child/".$self->config('userdat_file')) or die $!;
1631                         print USERDAT "$id=".&Util::md5($pass,$id)."\t0\n";
1632                         close(USERDAT);
1633                         
1634                         # ¥Æ¥ó¥×¥ì¡¼¥È¤«¤é¥Ú¡¼¥¸¤Î¥³¥Ô¡¼
1635                         my $farm_config = &Util::load_config_hash($self,$self->config('farmconf_file'));
1636                         if($farm_config->{'use_template'}==1 && $child ne "template"){
1637                                 my $template = $self->config('data_dir')."/template";
1638                                 my $depth = $self->_get_wiki_depth();
1639                                 my $count = 0;
1640                                 while((!(-e $template) || !(-d $template)) && $count < $depth && $farm_config->{'search_parent'}==1){
1641                                         $template =~ s/\/template$//;
1642                                         $template = $template."/../template";
1643                                         $count++;
1644                                 }
1645                                 if(-e $template && -d $template){
1646                                         opendir(DIR,$template) or die $!;
1647                                         while(my $entry = readdir(DIR)){
1648                                                 if($entry =~ /\.wiki$/){
1649                                                         copy($template."/$entry",$self->config('data_dir')."/$child/$entry");
1650                                                 }
1651                                         }
1652                                         closedir(DIR);
1653                                 }
1654                         }
1655                         # create_wiki¥Õ¥Ã¥¯¤Î¸Æ¤Ó½Ð¤·
1656                         $self->do_hook("create_wiki");
1657                 };
1658                 
1659                 # ¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¥¯¥ê¡¼¥ó¥¢¥Ã¥×½èÍý
1660                 if($@){
1661                         my $error = $@;
1662                         # ¤³¤³¤Ï¥¨¥é¡¼¤¬½Ð¤Æ¤â³¹Ô
1663                         eval {
1664                                 $self->remove_wiki("/$child");
1665                         };
1666                         die "$child¤ÎºîÀ®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£È¯À¸¤·¤¿¥¨¥é¡¼¤Ï°Ê²¼¤Î¤È¤ª¤ê¤Ç¤¹¡£\n\n$error";
1667                 }
1668         }
1669 }
1670
1671 #==============================================================================
1672 # <p>
1673 # ¸½ºß¤ÎWiki¤Î³¬ÁؤòÊֵѤ·¤Þ¤¹¡£¥ë¡¼¥È¤Î¾ì¹ç¤Ï0¡¢»ÒWiki¤Î¾ì¹ç¤Ï1¡¢
1674 # Â¹Wiki¤Î¾ì¹ç¤Ï2¡Ä¤È¤¤¤¦¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
1675 # </p>
1676 #==============================================================================
1677 sub _get_wiki_depth {
1678         my $self = shift;
1679         my $path_info = $self->get_CGI()->path_info();
1680         $path_info =~ s/^\///;
1681         my $depth = split(/\//,$path_info);
1682         return $depth;
1683 }
1684
1685 #==============================================================================
1686 # <p>
1687 # »ÒWiki¤òºï½ü¤·¤Þ¤¹¡£°ú¿ô¤Ë¤Ïºï½ü¤¹¤ëWiki¥µ¥¤¥È¤Î¥Ñ¥¹¡ÊPATH_INFOÉôʬ¡Ë¤òÅϤ·¤Þ¤¹¡£
1688 # ¤³¤Î¥á¥½¥Ã¥É¤Ïfarm¥×¥é¥°¥¤¥ó¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£
1689 # </p>
1690 # <pre>
1691 # $wiki-&gt;remove_wiki(Wiki¥µ¥¤¥È¤Î¥Ñ¥¹);
1692 # </pre>
1693 #==============================================================================
1694 sub remove_wiki {
1695         my $self = shift;
1696         my $path = shift;
1697         
1698         # ¥³¥¢¤Ç¥µ¥Ý¡¼¥È¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤òºï½ü
1699         rmtree($self->config('data_dir'  ).$path) or die $!;
1700         rmtree($self->config('backup_dir').$path) or die $!;
1701         rmtree($self->config('config_dir').$path) or die $!;
1702         rmtree($self->config('log_dir'   ).$path) or die $!;
1703         
1704         # remove_wiki¥Õ¥Ã¥¯¤Î¸Æ¤Ó½Ð¤·
1705         $self->get_CGI()->param('path',$path);
1706         $self->do_hook("remove_wiki");
1707 }
1708
1709 #==============================================================================
1710 # <p>
1711 # °ú¿ô¤ÇÅϤ·¤¿Ì¾¾Î¤Î»ÒWiki¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤òÄ´¤Ù¤Þ¤¹¡£
1712 # ¤³¤Î¥á¥½¥Ã¥É¤Ïfarm¥×¥é¥°¥¤¥ó¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£
1713 # </p>
1714 # <pre>
1715 # $wiki-&gt;wiki_exists(Wiki¥µ¥¤¥È̾);
1716 # </pre>
1717 #==============================================================================
1718 sub wiki_exists{
1719         my $self  = shift;
1720         my $child = shift;
1721         return ($child =~ /[A-Za-z0-9]+(\/[A-Za-z0-9]+)*/
1722                         and -d $self->config('data_dir')."/$child");
1723 }
1724
1725 #==============================================================================
1726 # <p>
1727 # »ÒWiki¤òÇÛÎó¤Ç¼èÆÀ¤·¤Þ¤¹¡£Â¹Wiki¡¢Á½Â¹Wiki¤ÏÇÛÎó¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¤È¤·¤Æ³ÊǼ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
1728 # </p>
1729 #==============================================================================
1730 sub get_wiki_list{
1731         my $self = shift;
1732         if($self->farm_is_enable){
1733                 my @list = $self->search_child($self->config('config_dir'));
1734                 return @list;
1735         } else {
1736                 return ();
1737         }
1738 }
1739
1740 #==============================================================================
1741 # <p>
1742 # »ÒWiki¤Î¥Ä¥ê¡¼¤òÇÛÎó¤Ç¼èÆÀ¤·¤Þ¤¹¡£
1743 # ¥Í¥¹¥È¤·¤¿Wiki¤ÏÇÛÎó¥ê¥Õ¥¡¥ì¥ó¥¹¤Ç³ÊǼ¤·¤Þ¤¹¡£
1744 # </p>
1745 #==============================================================================
1746 sub search_child {
1747         my $self = shift;
1748         my $dir  = shift;
1749         my @dirs = ();
1750         my @list = ();
1751         
1752         opendir(DIR,$dir) or die $!;
1753         while(my $entry = readdir(DIR)){
1754                 if(-d "$dir/$entry" && $entry ne "." && $entry ne ".."){
1755                         push(@dirs,$entry);
1756                 }
1757         }
1758         closedir(DIR);
1759         @dirs = sort @dirs;
1760         
1761         foreach my $entry (@dirs){
1762                 push(@list,$entry);
1763                 my @child = $self->search_child("$dir/$entry");
1764                 if($#child>-1){
1765                         push(@list,\@child);
1766                 }
1767         }
1768         
1769         return @list;
1770 }
1771
1772 #==============================================================================
1773 # <p>
1774 # ½ªÎ»Á°¤Î½èÍý¡£
1775 # </p>
1776 #==============================================================================
1777 sub _process_before_exit {
1778         my $self = shift;
1779         # ¥×¥é¥°¥¤¥óÍѤΥեå¯
1780         $self->do_hook('finalize');
1781         # finalize¥á¥½¥Ã¥É¤Î¸Æ¤Ó½Ð¤·
1782         $self->get_CGI()->finalize();
1783         $self->{storage}->finalize();
1784 }
1785
1786 1;