OSDN Git Service

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