OSDN Git Service

改行コードをLFに統一。
[fswiki/fswiki.git] / plugin / calendar / CalendarHandler.pm
1 ################################################################################
2 #
3 # Calendar¤Î¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¡£
4 #
5 ################################################################################
6 package plugin::calendar::CalendarHandler;
7 use strict;
8 #===============================================================================
9 # ¥³¥ó¥¹¥È¥é¥¯¥¿
10 #===============================================================================
11 sub new {
12         my $class = shift;
13         my $self = {};
14         return bless $self,$class;
15 }
16
17 #===============================================================================
18 # ¥Ú¡¼¥¸Ì¾¤òºîÀ®
19 #===============================================================================
20 sub make_pagename {
21         my $year  = shift;
22         my $month = shift;
23         my $day   = shift;
24         my $name  = shift;
25         
26         return $name."/".$year."-".$month."-".$day;
27 }
28
29 #===============================================================================
30 # ¥«¥ì¥ó¥À¤òºîÀ®
31 #===============================================================================
32 sub make_calendar {
33         my $wiki     = shift;
34         my $o_year   = shift;
35         my $o_month  = shift;
36         my $name     = shift;
37         my $template = shift;
38         my $id       = shift;
39
40         return "ÆüÉÕ¤¬¥µ¥Ý¡¼¥ÈÈϰϳ°¤Ç¤¹¡£" if($o_year >= 2030 || $o_year <= 1970);
41         my $time = time();
42         
43         my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime($time);
44         $year += 1900;
45         $mon  += 1;
46         my $today_year  = $year;
47         my $today_month = $mon;
48         my $today_day   = $mday;
49
50         my $o_yearmon = sprintf("%04d%02d",$o_year,$o_month);
51
52         while ($year!=$o_year || $mon!=$o_month) {
53                 my $yearmon = sprintf("%04d%02d",$year,$mon);
54                 if ($o_yearmon > $yearmon) {
55                         $time += 24 * 60 * 60;
56                 } else {
57                         $time -= 24 * 60 * 60;
58                 }
59                 
60                 ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime($time);
61                 $year += 1900;
62                 $mon  += 1;
63         }
64
65         ($id ne "") and ($id = "id=\"$id\"");
66
67         my $buf = "\n<div class=\"plugin-calendar\" $id>\n"
68                  ."<table class=\"calendar\" summary=\"calendar\">\n";
69         $buf .= "<tr><td class=\"image\" colspan=\"7\"></td></tr>\n";
70         $buf .= "<tr>\n";
71         $buf .= "  <td class=\"calendar-prev-month\" colspan=\"2\"><a href=\"".$wiki->create_url(&make_params($year,$mon,-1,$name,$template))."\">&lt;&lt;</a></td>\n";
72         $buf .= "  <td class=\"calendar-current-month\" colspan=\"3\"><a href=\"".$wiki->create_url(&make_params($year,$mon, 0,$name,$template))."\">$o_year-$o_month</a></td>\n";
73         $buf .= "  <td class=\"calendar-next-month\" colspan=\"2\"><a href=\"".$wiki->create_url(&make_params($year,$mon,+1,$name,$template))."\">&gt;&gt;</a></td>\n";
74         $buf .= "</tr>\n";
75
76         my @week = ("Æü","·î","²Ð","¿å","ÌÚ","¶â","ÅÚ");
77         $buf .= "<tr>\n";
78         foreach my $d (@week) {
79                 my $c = undef;
80                 if ($d eq "Æü") {
81                         $c = "sunday";
82                 } elsif ($d eq "ÅÚ") {
83                         $c = "saturday";
84                 } else {
85                         $c = "weekday";
86                 }
87                 $buf .= "  <td class=\"calendar-$c\">$d</td>\n";
88         }
89         $buf .= "</tr>\n";
90
91         my $time = $time - (($mday-1) * 24 * 60 * 60);
92         my $now_month = $mon;
93
94         my $start_flag = 1;
95         while ($now_month==$mon) {
96                 ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime($time);
97                 $year += 1900;
98                 $mon  += 1;
99                 if ($mon!=$now_month) {
100                         last;
101                 }
102                 if ($start_flag) {
103                         $buf .= "<tr>\n";
104                         for (my $i=0;$i<$wday;$i++) {
105                                 $buf .= "  <td class=\"calendar-day\"></td>\n";
106                         }
107                         $start_flag = 0;
108                 }
109                 my $page =&make_pagename($year,$mon,$mday,$name);
110                 # Í½Ä꤬¤¢¤ì¤Ð True¡¢Ìµ¤±¤ì¤Ð¡¢¤â¤·¤¯¤Ïµö²Ä¤¬Ìµ¤±¤ì¤Ð False¡£
111                 my $have_plan = ($wiki->page_exists($page) && $wiki->can_show($page));
112                 # º£Æü¤Ç¤¢¤ì¤Ð True¡¢¤½¤ì°Ê³°¤Ï False¡£
113                 my $is_today = $year==$today_year && $mon==$today_month && $mday==$today_day;
114                 $buf .= "  <td class=\"calendar-day";
115
116                 # °ÕÌ£¤Î¤¢¤ëÆüÉÕ
117                 my @class = ();
118                 # ÆüÉÕ¤¬º£Æü
119                 $is_today and do { push @class, "today"; };
120                 # Í½Äê¤Î¤¢¤ë
121                 $have_plan and do { push @class, "have"; };
122                 if ($is_today || $have_plan) {
123                         $buf .= " ".join(" ", @class);
124                 }
125                 $buf .= "\">";
126                 
127                 my $param = {page=>$page};
128                 $param->{template} = $template if (not($have_plan) && defined($template));
129                 $buf .= "<a href=\"".$wiki->create_url($param)."\">$mday</a></td>\n";
130
131                 if ($wday==6) {
132                         $buf .= "</tr>\n";
133                         $start_flag = 1;
134                 }
135                 $time += 24 * 60 * 60;
136         }
137
138         if ($wday != 0) {
139                 # ºÇ½ª¹Ô¤Î¶õÇò¤Î¥»¥ë¤ò½ÐÎÏ
140                 for (my $i = $wday; $i <= 6; $i++) {
141                         $buf .= "  <td class=\"calendar-day\"></td>\n";
142                 }
143                 $buf .= "</tr>\n";
144         }
145         
146         return $buf."</table>\n</div>\n";
147 }
148
149 #===============================================================================
150 # Á°·î¡¢Íâ·î¥¢¥ó¥«¤Î¥Ñ¥é¥á¡¼¥¿¤òºîÀ®
151 #===============================================================================
152 sub make_params {
153         my $year  = shift;
154         my $month = shift;
155         my $plus  = shift;
156         my $name  = shift;
157         my $template = shift;
158         
159         my $buf ={action=>'CALENDAR'};
160         
161         $month += $plus;
162         if ($month==13) {
163                 $year += 1;
164                 $month = 1;
165         } elsif ($month==0) {
166                 $year -= 1;
167                 $month = 12;
168         }
169
170         $buf->{year}     = $year;
171         $buf->{month}    = $month;
172         $buf->{name}     = $name;
173         $buf->{template} = $template if defined $template;
174
175         return $buf;
176 }
177
178 #===============================================================================
179 # £±¤«·îʬ
180 #===============================================================================
181 sub make_month_pages {
182         my $wiki  = shift;
183         my $year  = shift;
184         my $month = shift;
185         my $name  = shift;
186         
187         my $cgi = $wiki->get_CGI;
188         my $page = $cgi->param("page");
189         my $buf = "";
190
191         for (my $i=31;$i>=1;$i--) {
192                 my $pagename = &make_pagename($year,$month,$i,$name);
193                 if ($wiki->page_exists($pagename) && $wiki->can_show($pagename)) {
194                         $buf .= "{{paragraph 3,[[$year-$month-$i|$pagename]]}}\n";
195                         $buf .= "{{include $pagename}}\n";
196                 }
197         }
198         return $buf;
199 }
200
201 #===============================================================================
202 # º£Æü°ÊÁ°¤ÎºÇ¿·x·ï¤òɽ¼¨¤¹¤ë
203 # RecentCalendar¤«¤é¤â»È¤¦¤Î¤Ç¥á¥½¥Ã¥É¤Ç¤Ï¤Ê¤¯¥â¥¸¥å¡¼¥ë´Ø¿ô¤È¤·¤Æ¼ÂÁõ
204 #===============================================================================
205 sub make_recent_pages {
206         my $wiki  = shift;
207         my $name  = quotemeta(shift);
208         my $count = shift;
209         my $para  = shift;
210         my $cgi   = $wiki->get_CGI;
211         
212         $count =~ m/\s*([-]?\d*)\s*([+]?)([-]?)/;
213         my $reverse      = ($3   ?  1 : 0);
214         my $count        = ($1+0 ? $1 : 1);
215         my $ignore_today = ($2   ?  1 : 0);
216         
217         my @pages = $wiki->get_page_list;
218         
219         # ¥«¥ì¥ó¥À̾/ǯ-·î-Æü¤À¤±¼è¤ê½Ð¤¹
220         @pages = grep(/^$name\/\d+-\d+-\d+$/,@pages);
221         
222         # ¿·¤·¤¤ÆüÉÕ½ç¤Ë¥½¡¼¥È
223         @pages = sort {
224                 $a=~/^$name\/(\d+)-(\d+)-(\d+)$/;
225                 my $a_tmp = sprintf("%04d%02d%02d",$1,$2,$3);
226                 
227                 $b=~/^$name\/(\d+)-(\d+)-(\d+)$/;
228                 my $b_tmp = sprintf("%04d%02d%02d",$1,$2,$3);
229                 
230                 return $b_tmp<=>$a_tmp;
231         } @pages ;
232         
233         if ( $reverse ) { # $reverse ¤¬¿¿¤Ê¤é¡¢¥ê¥¹¥È¤òµÕž
234                 @pages = reverse @pages;
235         }
236         
237         # Ì¤Íè(²áµî)¤Î¤â¤Î¤Ï½ü¤¯
238         my @pages2;
239         my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time());
240         my $today = sprintf("%04d%02d%02d",$year+1900,$mon+1,$mday);
241         foreach (@pages) {
242                 $_=~/^$name\/(\d+)-(\d+)-(\d+)$/;
243                 my $tmp = sprintf("%04d%02d%02d",$1,$2,$3);
244                 if ( $reverse ) {
245                         if ($tmp >= ($today + ($ignore_today ? 1 : 0))) {
246                                 push(@pages2,$_);
247                         }
248                 } else {
249                         if ($tmp <= ($today - ($ignore_today ? 1 : 0))) {
250                                 push(@pages2,$_);
251                         }
252                 }
253         }
254
255         # calendar¥×¥é¥°¥¤¥ó¤ÈƱÍͤÎɽ¼¨
256         my $source = "";
257         foreach my $page (@pages2) {
258                 $page =~ /((\d+)-(\d+)-(\d+))$/;
259                 if($wiki->can_show($page)){
260                         last if($count<=0);
261                         if ($para ne "") {
262                                 $source .= "{{paragraph 3,[[$1|$page]]}}\n";
263                                 $source .= "{{include $page,$para}}\n";
264                         } else {
265                                 $source .= "{{paragraph 3,[[$1|$page]]}}\n";
266                                 $source .= "{{include $page}}\n";
267                         }
268                         $count--;
269                 }
270         }
271         
272         return $source;
273 }
274
275 #===============================================================================
276 # º£Æü°Ê¹ß¤ÎºÇ¶áx·ï¤òɽ¼¨¤¹¤ë
277 # FutureCalendar¤«¤é¤â»È¤¦¤Î¤Ç¥á¥½¥Ã¥É¤Ç¤Ï¤Ê¤¯¥â¥¸¥å¡¼¥ë´Ø¿ô¤È¤·¤Æ¼ÂÁõ
278 #===============================================================================
279 sub make_future_pages {
280         return &make_recent_pages(shift, shift, (shift)."-", shift);
281 }
282
283 #===============================================================================
284 # ¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¥á¥½¥Ã¥É
285 #===============================================================================
286 sub do_action {
287         my $self = shift;
288         my $wiki = shift;
289         my $cgi  = $wiki->get_CGI;
290
291         my $name     = $cgi->param("name");
292         my $year     = $cgi->param("year");
293         my $month    = $cgi->param("month");
294         my $template = $cgi->param("template");
295
296         if (not $wiki->page_exists($template)) {
297                 undef $template;
298         }
299
300         if ($name eq "" || !Util::check_numeric($year) || !Util::check_numeric($month)) {
301                 return $wiki->error("¥Ñ¥é¥á¡¼¥¿¤¬ÉÔÀµ¤Ç¤¹¡£");
302
303         } else {
304                 $wiki->set_title("$name/$year-$month");
305                 return &make_calendar($wiki,$year,$month,$name,$template).
306                        $wiki->process_wiki(&make_month_pages($wiki,$year,$month,$name));
307         }
308 }
309 1;