OSDN Git Service

5206f68d53bae2741bd13ce6ba02281144cd43ad
[fswiki/fswiki-lite.git] / plugin / core.pl
1 ################################################################################
2 #
3 # ¥³¥¢¥×¥é¥°¥¤¥ó¤Î¼ÂÁõ
4 #
5 ################################################################################
6 package Wiki::Plugin;
7
8 BEGIN {
9         # ¥Ñ¥é¥°¥é¥Õ¥×¥é¥°¥¤¥ó¤Î¥¨¥ó¥È¥ê
10         $main::P_PLUGIN->{recent}        = \&Wiki::Plugin::recent;
11         $main::P_PLUGIN->{recentdays}    = \&Wiki::Plugin::recentdays;
12         $main::P_PLUGIN->{category_list} = \&Wiki::Plugin::category_list;
13         $main::P_PLUGIN->{ref_image}     = \&Wiki::Plugin::ref_image;
14         $main::P_PLUGIN->{ref_text}      = \&Wiki::Plugin::ref_text;
15         $main::P_PLUGIN->{outline}       = \&Wiki::Plugin::outline;
16         $main::P_PLUGIN->{search}        = \&Wiki::Plugin::search;
17         
18         # ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤Î¥¨¥ó¥È¥ê
19         $main::I_PLUGIN->{category}     = \&Wiki::Plugin::category;
20         $main::I_PLUGIN->{lastmodified} = \&Wiki::Plugin::lastmodified;
21         $main::I_PLUGIN->{ref}          = \&Wiki::Plugin::ref;
22 }
23
24 #==============================================================================
25 # ¥Ú¡¼¥¸¤Î°ìÍ÷¤ò¹¹¿·Æü»þ½ç¤Ëɽ¼¨¤¹¤ë¥×¥é¥°¥¤¥ó¡£
26 #==============================================================================
27 sub recent {
28         my $max = shift;
29         $max = 0 if($max eq "");
30         my $buf = "";
31         
32         my @pages = &Wiki::get_page_list();
33         my $count = 0;
34         
35         $buf .= "<ul>\n";
36         foreach my $page (@pages){
37                 $buf .= "<li><a href=\"$main::MAIN_SCRIPT?p=".&Util::url_encode($page->{NAME})."\">".
38                         &Util::escapeHTML($page->{NAME})."</a></li>\n";
39                 $count++;
40                 last if($count==$max && $max!=0);
41         }
42         $buf .= "</ul>\n";
43         
44         return $buf;
45 }
46
47 #==============================================================================
48 # ÆüÉÕ¤´¤È¤Ë¹¹¿·¤µ¤ì¤¿¥Ú¡¼¥¸¤ò°ìÍ÷ɽ¼¨¤¹¤ë¥×¥é¥°¥¤¥ó¡£
49 #==============================================================================
50 sub recentdays {
51         my $max = shift;
52         $max = 5 if($max eq "");
53         my $buf = "";
54         
55         my @pages = &Wiki::get_page_list();
56         my $count = 0;
57         
58         my $last_year = 0;
59         my $last_mon  = 0;
60         my $last_day  = 0;
61         
62         foreach my $page (@pages){
63                 my ($sec, $min, $hour, $day, $mon, $year) = localtime($page->{TIME});
64                 
65                 $year += 1900;
66                 $mon  += 1;
67                 
68                 if($last_year!=$year || $last_mon!=$mon || $last_day!=$day){
69                         
70                         $count++;
71                         last if($count == $max+1);
72                         
73                         $last_year = $year;
74                         $last_mon  = $mon;
75                         $last_day  = $day;
76                         
77                         $buf .= "</ul>\n" if($buf ne "");
78                         $buf .= sprintf("<b>%04d/%02d/%02d</b>\n",$year,$mon,$day);
79                         $buf .= "<ul>\n";
80                 }
81                 
82                 $buf .= "<li><a href=\"$main::MAIN_SCRIPT?p=".&Util::url_encode($page->{NAME})."\">".
83                         &Util::escapeHTML($page->{NAME})."</a></li>\n";
84         }
85         
86         if($buf ne ""){
87                 $buf .= "</UL>\n";
88         }
89         
90         return $buf;
91 }
92
93 #==============================================================================
94 # ¥Ú¡¼¥¸¤ò¥«¥Æ¥´¥é¥¤¥º¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó¡£
95 #==============================================================================
96 sub category {
97         my $category = shift;
98         if($category eq ""){
99                 return "¥«¥Æ¥´¥ê¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£";
100         } else {
101                 return "[<a href=\"$main::CATEGORY_SCRIPT?c=".&Util::url_encode($category)."\">".
102                        "¥«¥Æ¥´¥ê:".&Util::escapeHTML($category)."</a>]";
103         }
104 }
105
106 #=============================================================================
107 # ¥Ú¡¼¥¸¤ÎºÇ½ª¹¹¿·Æü»þ¤òɽ¼¨¤¹¤ë¥×¥é¥°¥¤¥ó¡£
108 #=============================================================================
109 sub lastmodified {
110         my $page = $main::in{"p"};
111         if(&Wiki::exists_page($page)){
112                 return  "ºÇ½ª¹¹¿·»þ´Ö¡§".&Util::format_date(&Wiki::get_last_modified($page));
113         } else {
114                 return undef;
115         }
116 }
117
118 #=============================================================================
119 # ¥«¥Æ¥´¥ê¤´¤È¤Î¥Ú¡¼¥¸°ìÍ÷¤òɽ¼¨¤¹¤ë¥×¥é¥°¥¤¥ó¡£
120 #=============================================================================
121 sub category_list {
122         my $category = shift;
123         my $buf      = "";
124         
125         # »ØÄꤵ¤ì¤¿¥«¥Æ¥´¥ê¤òɽ¼¨
126         if($category ne ""){
127                 my @pages = &Wiki::get_page_list();
128                 $buf .= "<h2>".&Util::escapeHTML($category)."</h2>\n";
129                 $buf .= "<ul>\n";
130                 #foreach my $page (sort(@pages)){
131                 foreach my $page (sort {$a->{NAME} cmp $b->{NAME}} @pages){
132                         my $source = &Wiki::get_page($page->{NAME});
133                         foreach my $line (split(/\n/,$source)){
134                                 # ¥³¥á¥ó¥È¤«À°·ÁºÑ¥Æ¥­¥¹¥È¤Î¾ì¹ç¤ÏÈô¤Ð¤¹
135                                 next if($line =~ /^(\t| |\/\/)/);
136                                 
137                                 # ¥«¥Æ¥´¥ê¤Ë¥Þ¥Ã¥Á¤·¤¿¤é¥ê¥¹¥Æ¥£¥ó¥°
138                                 if($line =~ /{{category\s+$category}}/){
139                                         $buf .= "<li><a href=\"$main::MAIN_SCRIPT?p=".&Util::url_encode($page->{NAME})."\">".
140                                                 &Util::escapeHTML($page->{NAME})."</a></li>";
141                                         last;
142                                 }
143                         }
144                 }
145                 $buf .= "</ul>\n";
146         
147         # Á´¤Æ¤Î¥«¥Æ¥´¥ê¤òɽ¼¨
148         } else {
149                 my $category = {};
150                 my @pages = &Wiki::get_page_list();
151                 
152                 foreach my $page (@pages){
153                         my $source = &Wiki::get_page($page->{NAME});
154                         foreach my $line (split(/\n/,$source)){
155                                 # ¥³¥á¥ó¥È¤«À°·ÁºÑ¥Æ¥­¥¹¥È¤Î¾ì¹ç¤ÏÈô¤Ð¤¹
156                                 next if($line =~ /^(\t| |\/\/)/);
157                                 
158                                 # ¥«¥Æ¥´¥ê¤Ë¥Þ¥Ã¥Á¤·¤¿¤é¥ê¥¹¥Æ¥£¥ó¥°
159                                 while($line =~ /{{category\s+(.+?)}}/g){
160                                         $category->{$1}->{$page->{NAME}} = 1;
161                                 }
162                         }
163                 }
164                 
165                 foreach my $name (sort(keys(%$category))){
166                         $buf .= "<h2>".&Util::escapeHTML($name)."</h2>\n";
167                         $buf .= "<ul>\n";
168                         foreach my $page (sort(keys(%{$category->{$name}}))){
169                                 $buf .= "<li><a href=\"$main::MAIN_SCRIPT?p=".&Util::url_encode($page)."\">".
170                                       &Util::escapeHTML($page)."</a></li>\n";
171                         }
172                         $buf .= "</ul>\n";
173                 }
174         }
175         return $buf;
176 }
177
178 #=============================================================================
179 # ÅºÉÕ¥Õ¥¡¥¤¥ë¤Ø¤Î¥ê¥ó¥¯¤òɽ¼¨¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó¡£
180 #=============================================================================
181 sub ref {
182         my $page = $main::in{"p"};
183         my $file = shift;
184         
185         if($file eq ""){
186                 return "¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£";
187         }
188         
189         my $filename = sprintf("$main::ATTACH_DIR/%s.%s",
190                                                    &Util::url_encode($page),&Util::url_encode($file));
191         unless(-e $filename){
192                 return "¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó¡£";
193         }
194         
195         return sprintf("<a href=\"$main::DOWNLOAD_SCRIPT?p=%s&f=%s\">%s</a>",
196                        &Util::url_encode($page),&Util::url_encode($file),$file);
197 }
198
199 #=============================================================================
200 # ÅºÉÕ¥Õ¥¡¥¤¥ë¤ò²èÁü¤È¤·¤Æɽ¼¨¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó¡£
201 #=============================================================================
202 sub ref_image {
203         my $page = $main::in{"p"};
204         my $file = shift;
205         
206         if($file eq ""){
207                 return "¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£";
208         }
209         
210         my $filename = sprintf("$main::ATTACH_DIR/%s.%s",
211                                                    &Util::url_encode($page),&Util::url_encode($file));
212         unless(-e $filename){
213                 return "<p>¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó¡£</p>\n";
214         }
215         
216         return sprintf("<div><img src=\"$main::DOWNLOAD_SCRIPT?p=%s&f=%s\"></div>",
217                        &Util::url_encode($page),&Util::url_encode($file));
218 }
219
220 #=============================================================================
221 # ÅºÉÕ¥Õ¥¡¥¤¥ë¤ò²èÁü¤È¤·¤Æɽ¼¨¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó¡£
222 #=============================================================================
223 sub ref_text {
224         my $page = $main::in{"p"};
225         my $file = shift;
226         
227         if($file eq ""){
228                 return "¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£";
229         }
230         
231         my $filename = sprintf("$main::ATTACH_DIR/%s.%s",
232                                                    &Util::url_encode($page),&Util::url_encode($file));
233         unless(-e $filename){
234                 return "<p>¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó¡£</p>\n";
235         }
236         
237         my $text = "";
238         open(DATA,$filename);
239         while(<DATA>){
240                 $text .= $_;
241         }
242         close(DATA);
243         
244         # ²þ¹Ô¥³¡¼¥É¤òÊÑ´¹
245         $text =~ s/\r\n/\n/g;
246         $text =~ s/\r/\n/g;
247         # Ê¸»ú¥³¡¼¥É¤òÊÑ´¹
248         &jcode::convert(\$text,"euc");
249         
250         # pre¥¿¥°¤ò¤Ä¤±¤ÆÊÖµÑ
251         return "<pre>".&Util::escapeHTML($text)."</pre>\n";
252 }
253
254 #=============================================================================
255 # ¥¢¥¦¥È¥é¥¤¥ó¤òɽ¼¨¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó
256 # ½ÐÎϤµ¤ì¤ëHTML¤Ï¤Á¤ç¤Ã¤È¼êÈ´¤­¤Ç¤¹¡Ä
257 #=============================================================================
258 sub outline {
259         my $page   = $main::in{'p'};
260         my $source = &Wiki::get_page($page);
261         my $level  = 0;
262         my $count  = 0;
263         my $buf    = "";
264         foreach my $line (split(/\n/,$source)){
265                 if($line=~/^(!{1,3})(.+)$/){
266                         my $find_level = 4 - length($1);
267                         
268                         while($level < $find_level){
269                                 $buf .= "<ul>\n";
270                                 $level++;
271                         }
272                         
273                         while($level > $find_level){
274                                 $buf .= "</ul>\n";
275                                 $level--;
276                         }
277                         my $section = &Util::delete_tag(&Wiki::process_wiki($2));
278                         
279                         $buf .= "<li><a href=\"#p$count\">$section</a></li>\n";
280                         $count++;
281                 }
282         }
283         while($level > 0){
284                 $buf .= "</ul>\n";
285                 $level--;
286         }
287         return $buf;
288 }
289
290 #=============================================================================
291 # ¸¡º÷¥Õ¥©¡¼¥à¤òɽ¼¨¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó
292 #=============================================================================
293 sub search {
294         return "<form action=\"$main::MAIN_SCRIPT\" method=\"GET\">\n".
295                "  ¥­¡¼¥ï¡¼¥É <input type=\"text\" name=\"w\" size=\"20\" value=\"".&Util::escapeHTML($main::in{'w'})."\">\n".
296                "  <input type=\"submit\" value=\" ¸¡ º÷ \">\n".
297                "  <input type=\"hidden\" name=\"a\" value=\"search\">\n".
298                "</form>\n";
299 }
300
301 1;