OSDN Git Service

A little cleanup. Added \n into usages.
[pukiwiki/pukiwiki.git] / plugin / calendar_viewer.inc.php
1 <?php
2 /*
3  * PukiWiki calendar_viewer plubin
4  * $Id: calendar_viewer.inc.php,v 1.26 2004/12/30 09:21:05 henoheno Exp $
5  * Based on calendarrecent plugin
6  */
7
8 /*
9  * ³µÍ×
10  * calendar¥×¥é¥°¥¤¥ó¤äcalendar2¥×¥é¥°¥¤¥ó¤ÇºîÀ®¤·¤¿¥Ú¡¼¥¸¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó¤Ç¤¹¡£
11  * »È¤¤Êý
12  *  #calendar_viewer(pagename,(this|yyyy-mm|n|x*y),[mode],[separater])
13  *
14  ** pagename
15  * - calendar or calendar2¥×¥é¥°¥¤¥ó¤òµ­½Ò¤·¤Æ¤ë¥Ú¡¼¥¸Ì¾
16  *
17  ** (yyyy-mm|n|this)
18  * this    - º£·î¤Î¥Ú¡¼¥¸¤ò°ìÍ÷ɽ¼¨
19  * yyyy-mm - yyyy-mm¤Ç»ØÄꤷ¤¿Ç¯·î¤Î¥Ú¡¼¥¸¤ò°ìÍ÷ɽ¼¨
20  * n       - ÀèƬ¤«¤én·ï¤ò°ìÍ÷ɽ¼¨
21  * x*n     - ÀèƬ¤è¤ê¿ô¤¨¤Æ x ¥Ú¡¼¥¸ÌÜ(ÀèƬ¤Ï0)¤«¤é¡¢y·ï¤Å¤Ä°ìÍ÷ɽ¼¨
22  *
23  ** [mode]
24  * Default:past
25  * past   - º£Æü°ÊÁ°¤Î¥Ú¡¼¥¸¤Î°ìÍ÷ɽ¼¨¥â¡¼¥É¡£¹¹¿·ÍúÎò¤äÆüµ­¸þ¤­
26  * future - º£Æü°Ê¹ß¤Î¥Ú¡¼¥¸¤Î°ìÍ÷ɽ¼¨¥â¡¼¥É¡£¥¤¥Ù¥ó¥ÈͽÄê¤ä¥¹¥±¥¸¥å¡¼¥ë¸þ¤­
27  * view   - ²áµî¤«¤é̤Íè¤Ø¤Î°ìÍ÷ɽ¼¨¥â¡¼¥É¡£É½¼¨Í޻ߤ¹¤ë¥Ú¡¼¥¸¤Ï¤¢¤ê¤Þ¤»¤ó
28  *
29  ** [separater]
30  * - Ç¯·îÆü¤ò¶èÀڤ륻¥Ñ¥ì¡¼¥¿¤ò»ØÄê¡£
31  * - ¾Êά²Äǽ¡£¥Ç¥Õ¥©¥ë¥È¤Ï-¡£¡Êcalendar2¤Ê¤é¾Êά¤ÇOK¡Ë
32  *
33  * TODO
34  *  past or future ¤Ç·îñ°Ìɽ¼¨¤¹¤ë¤È¤­¤Ë¡¢¤½¤ì¤¾¤ìÍè·î¡¢Àè·î¤Î°ìÍ÷¤Ø¤Î¥ê¥ó¥¯¤òɽ¼¨¤·¤Ê¤¤¤è¤¦¤Ë¤¹¤ë
35  */
36
37 function plugin_calendar_viewer_convert()
38 {
39         global $vars, $get, $post, $hr, $script;
40         global $_err_calendar_viewer_param, $_err_calendar_viewer_param2;
41         global $_msg_calendar_viewer_right, $_msg_calendar_viewer_left;
42         global $_msg_calendar_viewer_restrict;
43
44         static $viewed = array();
45
46         if (func_num_args() < 2)
47                 return '#calendar_viewer(): ' . $_err_calendar_viewer_param . '<br />' . "\n";
48
49         $func_args = func_get_args();
50
51         // Default values
52         $pagename    = $func_args[0];   // ´ð½à¤È¤Ê¤ë¥Ú¡¼¥¸Ì¾
53         $page_YM     = '';      // °ìÍ÷ɽ¼¨¤¹¤ëǯ·î
54         $limit_base  = 0;       // ÀèƬ¤«¤é¿ô¤¨¤Æ²¿¥Ú¡¼¥¸Ìܤ«¤éɽ¼¨¤¹¤ë¤« (ÀèƬ)
55         $limit_pitch = 0;       // ²¿·ï¤Å¤Äɽ¼¨¤¹¤ë¤«
56         $limit_page  = 0;       // ¥µ¡¼¥Á¤¹¤ë¥Ú¡¼¥¸¿ô
57         $mode        = 'past';  // Æ°ºî¥â¡¼¥É
58         $date_sep    = '-';     // ÆüÉդΥ»¥Ñ¥ì¡¼¥¿ calendar2¤Ê¤é '-', calendar¤Ê¤é ''
59
60         // Check $func_args[1]
61         if (preg_match('/[0-9]{4}' . $date_sep . '[0-9]{2}/', $func_args[1])) {
62                 // »ØÄêǯ·î¤Î°ìÍ÷ɽ¼¨
63                 $page_YM     = $func_args[1];
64                 $limit_page  = 31;
65         } else if (preg_match('/this/si', $func_args[1])) {
66                 // º£·î¤Î°ìÍ÷ɽ¼¨
67                 $page_YM     = get_date('Y' . $date_sep . 'm');
68                 $limit_page  = 31;
69         } else if (preg_match('/^[0-9]+$/', $func_args[1])) {
70                 // nÆüʬɽ¼¨
71                 $limit_pitch = $func_args[1];
72                 $limit_page  = $func_args[1];
73         } else if (preg_match('/(-?[0-9]+)\*([0-9]+)/', $func_args[1], $matches)) {
74                 // ÀèƬ¤è¤ê¿ô¤¨¤Æ x ¥Ú¡¼¥¸Ìܤ«¤é¡¢y·ï¤Å¤Äɽ¼¨
75                 $limit_base  = $matches[1];
76                 $limit_pitch = $matches[2];
77                 $limit_page  = $matches[1] + $matches[2]; // ÆɤßÈô¤Ð¤¹ + É½¼¨¤¹¤ë
78         } else {
79                 return '#calendar_viewer(): ' . $_err_calendar_viewer_param2 . '<br />' . "\n";
80         }
81
82         // $func_args[2]: Mode setting
83         if (isset($func_args[2]) && preg_match('/^(past|view|future)$/si', $func_args[2]))
84                 $mode = $func_args[2];
85
86         // $func_args[3]: Change default delimiter
87         if (isset($func_args[3])) $date_sep = $func_args[3];
88
89         // Avoid Loop etc.
90         if (isset($viewed[$pagename])) {
91                 $s_page = htmlspecialchars($pagename);
92                 return "#calendar_viewer(): You already view: $s_page<br />";
93         } else {
94                 $viewed[$pagename] = TRUE; // Valid
95         }
96
97         // °ìÍ÷ɽ¼¨¤¹¤ë¥Ú¡¼¥¸Ì¾¤È¥Õ¥¡¥¤¥ë̾¤Î¥Ñ¥¿¡¼¥ó¡¡¥Õ¥¡¥¤¥ë̾¤Ë¤Ïǯ·î¤ò´Þ¤à
98         if ($pagename == '') {
99                 // pagename̵¤·¤Îyyyy-mm-dd¤ËÂбþ¤¹¤ë¤¿¤á¤Î½èÍý
100                 $pagepattern     = '';
101                 $pagepattern_len = 0;
102                 $filepattern     = encode($page_YM);
103                 $filepattern_len = strlen($filepattern);
104         } else {
105                 $pagepattern     = strip_bracket($pagename) . '/';
106                 $pagepattern_len = strlen($pagepattern);
107                 $filepattern     = encode($pagepattern . $page_YM);
108                 $filepattern_len = strlen($filepattern);
109         }
110
111         // ¥Ú¡¼¥¸¥ê¥¹¥È¤Î¼èÆÀ
112         $pagelist = array();
113         if ($dir = @opendir(DATA_DIR)) {
114                 $_date = get_date('Y' . $date_sep . 'm' . $date_sep . 'd');
115                 $page_date  = '';
116                 while($file = readdir($dir)) {
117                         if ($file == '..' || $file == '.') continue;
118                         if (substr($file, 0, $filepattern_len) != $filepattern) continue;
119
120                         $page      = decode(trim(preg_replace('/\.txt$/', ' ', $file)));
121                         $page_date = substr($page, $pagepattern_len);
122
123                         // Verify the $page_date pattern (Default: yyyy-mm-dd).
124                         // Past-mode hates the future, and
125                         // Future-mode hates the past.
126                         if ((plugin_calendar_viewer_isValidDate($page_date, $date_sep) == FALSE) || 
127                                 ($page_date > $_date && ($mode == 'past')) ||
128                                 ($page_date < $_date && ($mode == 'future')))
129                                         continue;
130
131                         $pagelist[] = $page;
132                 }
133         }
134         closedir($dir);
135
136         if ($mode == 'past') {
137                 rsort($pagelist);       // New => Old
138         } else {
139                 sort($pagelist);        // Old => New
140         }
141
142         // Include start
143         $tmppage     = $vars['page'];
144         $return_body = '';
145
146         // $limit_page ¤Î·ï¿ô¤Þ¤Ç¥¤¥ó¥¯¥ë¡¼¥É
147         $tmp = max($limit_base, 0); // Skip minus
148         while ($tmp < $limit_page) {
149                 if (! isset($pagelist[$tmp])) break;
150
151                 $page = $pagelist[$tmp];
152                 $get['page'] = $post['page'] = $vars['page'] = $page;
153
154                 // ¸½¾õ¤Ç±ÜÍ÷µö²Ä¤¬¤¢¤ë¾ì¹ç¤À¤±É½¼¨¤¹¤ë
155                 if (check_readable($page, FALSE, FALSE)) {
156                         $body = convert_html(get_source($page));
157                 } else {
158                         $body = str_replace('$1', $page, $_msg_calendar_viewer_restrict);
159                 }
160
161                 $r_page = rawurlencode($page);
162                 $s_page = htmlspecialchars($page);
163                 $link   = '<a href="' . $script . '?cmd=edit&amp;page=' . $r_page . '">' . $s_page . '</a>';
164                 $head   = '<h1>' . $link . '</h1>' . "\n";
165                 $return_body .= $head . $body;
166
167                 ++$tmp;
168         }
169
170         // ¤³¤³¤Ç¡¢Á°¸å¤Î¥ê¥ó¥¯¤òɽ¼¨
171         // ?plugin=calendar_viewer&file=¥Ú¡¼¥¸Ì¾&date=yyyy-mm
172         $enc_pagename = rawurlencode(substr($pagepattern, 0, $pagepattern_len - 1));
173
174         if ($page_YM != '') {
175                 // Ç¯·îɽ¼¨»þ
176                 $date_sep_len = strlen($date_sep);
177                 $this_year    = substr($page_YM, 0, 4);
178                 $this_month   = substr($page_YM, 4 + $date_sep_len, 2);
179
180                 // ¼¡·î
181                 $next_year  = $this_year;
182                 $next_month = $this_month + 1;
183                 if ($next_month > 12) {
184                         ++$next_year;
185                         $next_month = 1;
186                 }
187                 $next_YM = sprintf('%04d%s%02d', $next_year, $date_sep, $next_month);
188
189                 // Á°·î
190                 $prev_year  = $this_year;
191                 $prev_month = $this_month - 1;
192                 if ($prev_month < 1) {
193                         --$prev_year;
194                         $prev_month = 12;
195                 }
196                 $prev_YM = sprintf('%04d%s%02d', $prev_year, $date_sep, $prev_month);
197                 if ($mode == 'past') {
198                         $right_YM   = $prev_YM;
199                         $right_text = $prev_YM . '&gt;&gt;'; // >>
200                         $left_YM    = $next_YM;
201                         $left_text  = '&lt;&lt;' . $next_YM; // <<
202                 } else {
203                         $left_YM    = $prev_YM;
204                         $left_text  = '&lt;&lt;' . $prev_YM; // <<
205                         $right_YM   = $next_YM;
206                         $right_text = $next_YM . '&gt;&gt;'; // >>
207                 }
208         } else {
209                 // n·ïɽ¼¨»þ
210                 if ($limit_base < 0) {
211                         $left_YM = ''; // É½¼¨¤·¤Ê¤¤ (¤½¤ì¤è¤êÁ°¤Î¹àÌܤϤʤ¤)
212                 } else {
213                         $left_YM   = $limit_base - $limit_pitch . '*' . $limit_pitch;
214                         $left_text = sprintf($_msg_calendar_viewer_left, $limit_pitch);
215
216                 }
217                 if ($limit_base + $limit_pitch >= count($pagelist)) {
218                         $right_YM = ''; // É½¼¨¤·¤Ê¤¤ (¤½¤ì¤è¤ê¸å¤Î¹àÌܤϤʤ¤)
219                 } else {
220                         $right_YM   = $limit_base + $limit_pitch . '*' . $limit_pitch;
221                         $right_text = sprintf($_msg_calendar_viewer_right, $limit_pitch);
222                 }
223         }
224
225         // ¥Ê¥Ó¥²¡¼¥ÈÍѤΥê¥ó¥¯¤òËöÈø¤ËÄɲÃ
226         if ($left_YM != '' || $right_YM != '') {
227                 $s_date_sep = htmlspecialchars($date_sep);
228                 $left_link = $right_link = '';
229                 $link = $script . '?plugin=calendar_viewer&amp;mode=' . $mode .
230                         '&amp;file=' . $enc_pagename . '&amp;date_sep=' . $s_date_sep . '&amp;';
231                 if ($left_YM != '')
232                         $left_link = '<a href="' . $link .
233                                 'date=' . $left_YM . '">' . $left_text . '</a>';
234                 if ($right_YM != '')
235                         $right_link = '<a href="' . $link .
236                                 'date=' . $right_YM . '">' . $right_text . '</a>';
237                 // past mode¤Ï<<¿· µì>> Â¾¤Ï<<µì ¿·>>
238                 $return_body .=
239                         '<table width ="100%"><tr>' .
240                         '<td align="left">'  . $left_link  . '</td>' .
241                         '<td align="right">' . $right_link . '</td>' .
242                         '</tr></table>';
243         }
244
245         $get['page'] = $post['page'] = $vars['page'] = $tmppage;
246
247         return $return_body;
248 }
249
250 function plugin_calendar_viewer_action()
251 {
252         global $vars, $get, $post, $hr, $script;
253
254         $date_sep = '-';
255
256         $return_vars_array = array();
257
258         $page = strip_bracket($vars['page']);
259         $vars['page'] = '*';
260         if (isset($vars['file'])) $vars['page'] = $vars['file'];
261
262         $date_sep = $vars['date_sep'];
263
264         $page_YM = $vars['date'];
265         if ($page_YM == '') $page_YM = get_date('Y' . $date_sep . 'm');
266         $mode = $vars['mode'];
267
268         $args_array = array($vars['page'], $page_YM, $mode, $date_sep);
269         $return_vars_array['body'] = call_user_func_array('plugin_calendar_viewer_convert', $args_array);
270
271         //$return_vars_array['msg'] = 'calendar_viewer ' . $vars['page'] . '/' . $page_YM;
272         $return_vars_array['msg'] = 'calendar_viewer ' . htmlspecialchars($vars['page']);
273         if ($vars['page'] != '') $return_vars_array['msg'] .= '/';
274         if (preg_match('/\*/', $page_YM)) {
275                 // ¤¦¡¼¤ó¡¢n·ïɽ¼¨¤Î»þ¤Ï¤Ê¤ó¤Æ¥Ú¡¼¥¸Ì¾¤Ë¤·¤¿¤é¤¤¤¤¡©
276         } else {
277                 $return_vars_array['msg'] .= htmlspecialchars($page_YM);
278         }
279
280         $vars['page'] = $page;
281         return $return_vars_array;
282 }
283
284 function plugin_calendar_viewer_isValidDate($aStr, $aSepList = '-/ .')
285 {
286         if ($aSepList == '') {
287                 // yyymmdd¤È¤·¤Æ¥Á¥§¥Ã¥¯¡Ê¼êÈ´¤­(^^;¡Ë
288                 return checkdate(substr($aStr, 4, 2), substr($aStr, 6, 2), substr($aStr, 0, 4));
289         } else if (ereg("^([0-9]{2,4})[$aSepList]([0-9]{1,2})[$aSepList]([0-9]{1,2})$", $aStr, $m) ) {
290                 return checkdate($m[2], $m[3], $m[1]);
291         } else {
292                 return FALSE;
293         }
294 }
295
296 ?>