]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/CalendarList.php
Activated Id substitution for Subversion
[SourceForge/phpwiki.git] / lib / plugin / CalendarList.php
1 <?php // -*-php-*-
2 rcs_id('$Id$');
3
4 /**
5  Copyright 1999-2002,2005-2007 $ThePhpWikiProgrammingTeam
6
7  This file is part of PhpWiki.
8
9  PhpWiki is free software; you can redistribute it and/or modify
10  it under the terms of the GNU General Public License as published by
11  the Free Software Foundation; either version 2 of the License, or
12  (at your option) any later version.
13
14  PhpWiki is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with PhpWiki; if not, write to the Free Software
21  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  */
23
24 // if not defined in config.ini
25 if (!defined('PLUGIN_CALENDARLIST_ORDER'))      
26   define('PLUGIN_CALENDARLIST_ORDER',   'normal');
27 if (!defined('PLUGIN_CALENDARLIST_NEXT_N_DAYS'))
28   define('PLUGIN_CALENDARLIST_NEXT_N_DAYS','');
29 if (!defined('PLUGIN_CALENDARLIST_NEXT_N'))     
30   define('PLUGIN_CALENDARLIST_NEXT_N',   '');
31 if (!defined('PLUGIN_CALENDARLIST_LAST_N_DAYS'))
32   define('PLUGIN_CALENDARLIST_LAST_N_DAYS','');
33 if (!defined('PLUGIN_CALENDARLIST_LAST_N'))     
34   define('PLUGIN_CALENDARLIST_LAST_N',   '');
35
36 /**
37  * This is a list of calendar appointments. 
38  * Same arguments as Calendar, so no one is confused
39  * Uses <dl><dd>DATE<dt>page contents...
40  * Derived from Calendar.php by Martin Norbäck <martin@safelogic.se>
41  *
42  * Insert this plugin into your Calendar page, for example in WikiUser/Calendar:
43  *   <?plugin Calendar ?>
44  *   <?plugin CalendarList ?>
45  *
46  * Honors now year + month args as start base - together with Calendar navigation.
47  * The behaviour before 2007 with last/next_n_days was to start now.
48  *
49  */
50 class WikiPlugin_CalendarList
51 extends WikiPlugin
52 {
53     function getName () {
54         return _("CalendarList");
55     }
56
57     function getDescription () {
58         return _("CalendarList");
59     }
60
61     function getVersion() {
62         return preg_replace("/[Revision: $]/", '',
63                             "\$Revision: 1.13 $");
64     }
65
66     function getDefaultArguments() {
67         return array('prefix'       => '[pagename]',
68                      'date_format'  => '%Y-%m-%d',
69                      'order'        => PLUGIN_CALENDARLIST_ORDER, // normal or reverse (report sequence)
70                      'year'         => '',
71                      'month'        => '',
72                      'month_offset' => 0,
73                      //support ranges: next n days/events
74                      'next_n_days'  => PLUGIN_CALENDARLIST_NEXT_N_DAYS, // one or the other, not both
75                      'next_n'       => PLUGIN_CALENDARLIST_NEXT_N,
76                      // last n days/entries:
77                      'last_n_days'  => PLUGIN_CALENDARLIST_LAST_N_DAYS, // one or the other, not both
78                      'last_n'       => PLUGIN_CALENDARLIST_LAST_N,
79
80                      'month_format' => '%B %Y',
81                      'wday_format'  => '%a',
82                      'start_wday'   => '1');
83     }
84
85     /**
86      * return links (static only as of action=edit) 
87      *
88      * @param string $argstr The plugin argument string.
89      * @param string $basepage The pagename the plugin is invoked from.
90      * @return array List of pagenames linked to (or false).
91      */
92     function getWikiPageLinks ($argstr, $basepage) {
93         if (isset($this->_links)) 
94             return $this->_links;
95         else {
96             global $request;    
97             $this->run($request->_dbi, $argstr, $request, $basepage);
98             return $this->_links;
99         }
100     }
101
102     function _count_events($dbi, $n = 7, $direction = 1) {
103         //      This is used by the last_n/next_n options to determine the date that
104         //      accounts for the number of N events in the past/future.
105         //      RETURNS: date of N-th event or the last item found
106         $args = &$this->args;                           // gather the args array
107         $timeTMP = time();                              // start with today's date
108         $t = $timeTMP;                                  // init the control date variable to now
109         
110         for ($i=0; $i<=180; $i++) {                     // loop thru 180 days, past or future
111             $date_string = strftime($args['date_format'], $t);
112             $page_for_date = $args['prefix'] . SUBPAGE_SEPARATOR . $date_string;
113             if ($dbi->isWikiPage($page_for_date)) { // if this date has any comments/events
114                 $timeTMP = $t;                      //  capture the date of this event for return
115                 if ($n-- <= 0) break;               //  if we reached the limit, return the date
116             }
117             $t += 24 * 3600 * $direction;           // advance one day back or forward
118         }
119         
120         // return the date of the N-th or last, most past/future event in the range
121         return $timeTMP;
122     }
123
124     function _date($dbi, $time) {
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         $this->args = $this->getArgs($argstr, $request);
155         $args       = &$this->args;
156         $this->_links = array();
157
158         // default to this month
159         $now = localtime(time() + 3600 * $request->getPref('timeOffset'), 1);
160         $args['mday'] = $now['tm_mday'];
161         foreach ( array('month' => $now['tm_mon'] + 1,
162                         'year'  => $now['tm_year'] + 1900,
163                         'mday'  => $now['tm_mday'])
164                   as $param => $dflt )
165         {
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         }
181         elseif ($args['last_n']) {
182             // get date for last nth event
183             $start = $this->_count_events($dbi, $args['last_n'], -1);
184         }
185         else {
186             // start of requested month
187             $start = mktime(0, 0, 0, // h, m, s
188                             $args['month'] + $args['month_offset'], // month (1-12)
189                             1, // days prior
190                             $args['year']);
191         }
192
193         // determine end date
194         if ($args['next_n_days']) {
195             // n days from now, affected by month and year
196             $end = $base + ($args['next_n_days'] * 24 * 3600.0);
197         }
198         elseif ($args['last_n']) {
199             // get date for next nth event
200             $end = $this->_count_events($dbi, $args['next_n'], 1);
201         }
202         else {
203             // trick to get last day of requested month
204             $end = mktime(0, 0, -1, // h, m, s
205                             $args['month'] + 1 + $args['month_offset'], // month (1-12)
206                             1, // days prior
207                             $args['year']);
208         }
209
210         // switch values for reverse order
211         $step = 24 * 3600;
212         if ($args['order'] == 'reverse') {
213             $time_tmp = $start;
214             $start = $end;
215             $end = $time_tmp;
216             $step *= -1;
217         }
218
219         // style tag on wiki description but not in here
220         $cal = HTML::dl();
221
222         // loop through dates and create list
223         for ($i = $start; ($step > 0) ? $i < $end : $i > $end; $i += $step) {
224             $cal->pushContent($this->_date($dbi, $i));
225         }
226         //      end of Plugin CalendarList display logic
227         // ***************************************************
228
229         return $cal;
230     }
231 };
232
233
234 // $Log: not supported by cvs2svn $
235 // Revision 1.12  2008/08/17 07:45:03  vargenau
236 // No comma in default
237 //
238 // Revision 1.11  2008/02/14 18:58:15  rurban
239 // provide mday default
240 //
241 // Revision 1.10  2007/09/01 13:39:46  rurban
242 //  CalendarList pages now in parallel with Calendar: year + month args as start base, The behaviour before 2007 with last/next_n_days was to start now.
243 //
244 // Revision 1.9  2006/05/14 17:40:31  rurban
245 // Patch #1232730 by banjo
246 //
247 // Revision 1.8  2005/10/12 06:18:31  rurban
248 // dont overdo constants
249 //
250 // Revision 1.7  2005/07/21 18:55:55  rurban
251 // applied mpullen patch (Revised to work on all date range combinations...),
252 // but still does not work as documented.
253 //
254 // Revision 1.6.2  2005/06/24 12:00:00  mpullen
255 //   Corrected bug in the main WHILE loop to detect proper termination point in time
256 //   {it was stopping one day too soon in either direction}.
257 //
258 // Revision 1.6.1  2005/06/23 12:00:00  mpullen
259 //   Revised to work on all date range combinations (past and future, by days or count of events)
260 //   Externalized five control parameter constants to the config.ini file (new section 8 for PLUGINs)
261 //
262 // Revision 1.6  2005/04/02 03:05:44  uckelman
263 // Removed & from vars passed by reference (not needed, causes PHP to complain).
264 //
265 // Revision 1.5  2004/12/06 19:15:04  rurban
266 // save edit-time links as requested in #946679
267 //
268 // Revision 1.4  2004/12/06 18:32:39  rurban
269 // added order=reverse: feature request from #981109
270 //
271 // Revision 1.3  2004/09/22 13:36:45  rurban
272 // Support ranges, based on a simple patch by JoshWand
273 //   next_n_days, last_n_days, next_n
274 //   last_n not yet
275 //
276 // Revision 1.2  2004/02/17 12:11:36  rurban
277 // added missing 4th basepage arg at plugin->run() to almost all plugins. This caused no harm so far,
278 //      because it was silently dropped on normal usage. However on plugin internal ->run invocations it failed.
279 //      (InterWikiSearch, IncludeSiteMap, ...)
280 //
281 // Revision 1.1  2003/11/18 19:06:03  carstenklapp
282 // New plugin to be used in conjunction with the Calendar plugin.
283 // Upgraded to use SUBPAGE_SEPARATOR for subpages. SF patch tracker
284 // submission 565369.
285 //
286
287
288 // For emacs users
289 // Local Variables:
290 // mode: php
291 // tab-width: 8
292 // c-basic-offset: 4
293 // c-hanging-comment-ender-p: nil
294 // indent-tabs-mode: nil
295 // End:
296 ?>