]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/CalendarList.php
Wiki page --> wiki page
[SourceForge/phpwiki.git] / lib / plugin / CalendarList.php
1 <?php
2
3 /**
4  * * Copyright 1999-2002,2005-2007 $ThePhpWikiProgrammingTeam
5  *
6  * This file is part of PhpWiki.
7  *
8  * PhpWiki is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * PhpWiki is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with PhpWiki; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22
23 // if not defined in config.ini
24 if (!defined('PLUGIN_CALENDARLIST_ORDER'))
25     define('PLUGIN_CALENDARLIST_ORDER', 'normal');
26 if (!defined('PLUGIN_CALENDARLIST_NEXT_N_DAYS'))
27     define('PLUGIN_CALENDARLIST_NEXT_N_DAYS', '');
28 if (!defined('PLUGIN_CALENDARLIST_NEXT_N'))
29     define('PLUGIN_CALENDARLIST_NEXT_N', '');
30 if (!defined('PLUGIN_CALENDARLIST_LAST_N_DAYS'))
31     define('PLUGIN_CALENDARLIST_LAST_N_DAYS', '');
32 if (!defined('PLUGIN_CALENDARLIST_LAST_N'))
33     define('PLUGIN_CALENDARLIST_LAST_N', '');
34
35 /**
36  * This is a list of calendar appointments.
37  * Same arguments as Calendar, so no one is confused
38  * Uses <dl><dd>DATE<dt>page contents...
39  * Derived from Calendar.php by Martin Norbäck <martin@safelogic.se>
40  *
41  * Insert this plugin into your Calendar page, for example in WikiUser/Calendar:
42  *   <<Calendar >>
43  *   <<CalendarList >>
44  *
45  * Honors now year + month args as start base - together with Calendar navigation.
46  * The behaviour before 2007 with last/next_n_days was to start now.
47  *
48  */
49 class WikiPlugin_CalendarList
50     extends WikiPlugin
51 {
52     function getName()
53     {
54         return _("CalendarList");
55     }
56
57     function getDescription()
58     {
59         return _("CalendarList");
60     }
61
62     function getDefaultArguments()
63     {
64         return array('prefix' => '[pagename]',
65             'date_format' => '%Y-%m-%d',
66             'order' => PLUGIN_CALENDARLIST_ORDER, // normal or reverse (report sequence)
67             'year' => '',
68             'month' => '',
69             'month_offset' => 0,
70             //support ranges: next n days/events
71             'next_n_days' => PLUGIN_CALENDARLIST_NEXT_N_DAYS, // one or the other, not both
72             'next_n' => PLUGIN_CALENDARLIST_NEXT_N,
73             // last n days/entries:
74             'last_n_days' => PLUGIN_CALENDARLIST_LAST_N_DAYS, // one or the other, not both
75             'last_n' => PLUGIN_CALENDARLIST_LAST_N,
76
77             'month_format' => '%B %Y',
78             'wday_format' => '%a',
79             'start_wday' => '1');
80     }
81
82     /**
83      * return links (static only as of action=edit)
84      *
85      * @param  string $argstr   The plugin argument string.
86      * @param  string $basepage The pagename the plugin is invoked from.
87      * @return array  List of pagenames linked to (or false).
88      */
89     function getWikiPageLinks($argstr, $basepage)
90     {
91         if (isset($this->_links))
92             return $this->_links;
93         else {
94             global $request;
95             $this->run($request->_dbi, $argstr, $request, $basepage);
96             return $this->_links;
97         }
98     }
99
100     function _count_events($dbi, $n = 7, $direction = 1)
101     {
102         //        This is used by the last_n/next_n options to determine the date that
103         //        accounts for the number of N events in the past/future.
104         //        RETURNS: date of N-th event or the last item found
105         $args = &$this->args; // gather the args array
106         $timeTMP = time(); // start with today's date
107         $t = $timeTMP; // init the control date variable to now
108
109         for ($i = 0; $i <= 180; $i++) { // loop thru 180 days, past or future
110             $date_string = strftime($args['date_format'], $t);
111             $page_for_date = $args['prefix'] . SUBPAGE_SEPARATOR . $date_string;
112             if ($dbi->isWikiPage($page_for_date)) { // if this date has any comments/events
113                 $timeTMP = $t; //  capture the date of this event for return
114                 if ($n-- <= 0) break; //  if we reached the limit, return the date
115             }
116             $t += 24 * 3600 * $direction; // advance one day back or forward
117         }
118
119         // return the date of the N-th or last, most past/future event in the range
120         return $timeTMP;
121     }
122
123     function _date($dbi, $time)
124     {
125         $args = &$this->args;
126         $date_string = strftime($args['date_format'], $time);
127
128         $page_for_date = $args['prefix'] . SUBPAGE_SEPARATOR . $date_string;
129         $t = localtime($time, 1);
130
131         $td = HTML::td(array('align' => 'center'));
132
133         if ($dbi->isWikiPage($page_for_date)) {
134             // Extract the page contents for this date
135             $p = $dbi->getPage($page_for_date);
136             $r = $p->getCurrentRevision();
137             $c = $r->getContent();
138             include_once 'lib/BlockParser.php';
139             $content = TransformText(implode("\n", $c), $r->get('markup'));
140             $link = HTML::a(array('class' => 'cal-hide',
141                     'href' => WikiURL($page_for_date,
142                         array('action' => 'edit')),
143                     'title' => sprintf(_("Edit %s"), $page_for_date)),
144                 $date_string);
145             $this->_links[] = $page_for_date;
146             $a = array(HTML::dt($link), HTML::dd($content));
147         } else {
148             $a = array();
149         }
150         return $a;
151     }
152
153     function run($dbi, $argstr, &$request, $basepage)
154     {
155         $this->args = $this->getArgs($argstr, $request);
156         $args = &$this->args;
157         $this->_links = array();
158
159         // default to this month
160         $now = localtime(time() + 3600 * $request->getPref('timeOffset'), 1);
161         $args['mday'] = $now['tm_mday'];
162         foreach (array('month' => $now['tm_mon'] + 1,
163                      'year' => $now['tm_year'] + 1900,
164                      'mday' => $now['tm_mday'])
165                  as $param => $dflt) {
166             if (!($args[$param] = intval($args[$param])))
167                 $args[$param] = $dflt;
168         }
169         $base = mktime(0, 0, 0, // h, m, s
170             $args['month'], // month 1-12
171             $args['mday'],
172             $args['year']); // must have base 1900
173
174         // ***************************************************
175         // start of Plugin CalendarList display logic
176         // determine start date
177         if ($args['last_n_days']) { // back by month
178             // n days ago, affected by month or month_offset
179             $start = $base - ($args['last_n_days'] * 24 * 3600.0);
180         } elseif ($args['last_n']) {
181             // get date for last nth event
182             $start = $this->_count_events($dbi, $args['last_n'], -1);
183         } else {
184             // start of requested month
185             $start = mktime(0, 0, 0, // h, m, s
186                 $args['month'] + $args['month_offset'], // month (1-12)
187                 1, // days prior
188                 $args['year']);
189         }
190
191         // determine end date
192         if ($args['next_n_days']) {
193             // n days from now, affected by month and year
194             $end = $base + ($args['next_n_days'] * 24 * 3600.0);
195         } elseif ($args['last_n']) {
196             // get date for next nth event
197             $end = $this->_count_events($dbi, $args['next_n'], 1);
198         } else {
199             // trick to get last day of requested month
200             $end = mktime(0, 0, -1, // h, m, s
201                 $args['month'] + 1 + $args['month_offset'], // month (1-12)
202                 1, // days prior
203                 $args['year']);
204         }
205
206         // switch values for reverse order
207         $step = 24 * 3600;
208         if ($args['order'] == 'reverse') {
209             $time_tmp = $start;
210             $start = $end;
211             $end = $time_tmp;
212             $step *= -1;
213         }
214
215         // style tag on wiki description but not in here
216         $cal = HTML::dl();
217
218         // loop through dates and create list
219         for ($i = $start; ($step > 0) ? $i < $end : $i > $end; $i += $step) {
220             $cal->pushContent($this->_date($dbi, $i));
221         }
222         //        end of Plugin CalendarList display logic
223         // ***************************************************
224
225         return $cal;
226     }
227 }
228
229 // Local Variables:
230 // mode: php
231 // tab-width: 8
232 // c-basic-offset: 4
233 // c-hanging-comment-ender-p: nil
234 // indent-tabs-mode: nil
235 // End: