1de76d2a4SMichael Klier<?php 2de76d2a4SMichael Klier/** 3de76d2a4SMichael Klier * DokuWiki Syntax Plugin WikiCalendar 4de76d2a4SMichael Klier * 5de76d2a4SMichael Klier * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6de76d2a4SMichael Klier * @author Michael Klier <chi@chimeric.de> 7de76d2a4SMichael Klier */ 8de76d2a4SMichael Klier 9de76d2a4SMichael Klierif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); 10de76d2a4SMichael Klierif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 11de76d2a4SMichael Klierrequire_once(DOKU_PLUGIN.'syntax.php'); 12de76d2a4SMichael Klier 13de76d2a4SMichael Klier/** 14de76d2a4SMichael Klier * All DokuWiki plugins to extend the parser/rendering mechanism 15de76d2a4SMichael Klier * need to inherit from this class 16de76d2a4SMichael Klier */ 17de76d2a4SMichael Klierclass syntax_plugin_wikicalendar extends DokuWiki_Syntax_Plugin { 18de76d2a4SMichael Klier 19de76d2a4SMichael Klier /** 20de76d2a4SMichael Klier * namespace of the calendar 21de76d2a4SMichael Klier */ 22de76d2a4SMichael Klier var $calendar_ns = ''; 23de76d2a4SMichael Klier 24de76d2a4SMichael Klier /** 25de76d2a4SMichael Klier * namespace of the current viewed month 26de76d2a4SMichael Klier */ 27de76d2a4SMichael Klier var $month_ns = ''; 28de76d2a4SMichael Klier 29de76d2a4SMichael Klier /** 30de76d2a4SMichael Klier * indicator if first week of the month has been generated 31de76d2a4SMichael Klier */ 32de76d2a4SMichael Klier var $firstWeek = false; 33de76d2a4SMichael Klier 34de76d2a4SMichael Klier /** 35de76d2a4SMichael Klier * array with localisations of weekdays 36de76d2a4SMichael Klier */ 37de76d2a4SMichael Klier var $langDays = array(); 38de76d2a4SMichael Klier 39de76d2a4SMichael Klier /** 40de76d2a4SMichael Klier * array with localistaions of month 41de76d2a4SMichael Klier */ 42de76d2a4SMichael Klier var $langMonth = array(); 43de76d2a4SMichael Klier 44de76d2a4SMichael Klier /** 45de76d2a4SMichael Klier * the current date 46de76d2a4SMichael Klier */ 47de76d2a4SMichael Klier var $curDate = array(); 48de76d2a4SMichael Klier 49de76d2a4SMichael Klier /** 50de76d2a4SMichael Klier * the month to show 51de76d2a4SMichael Klier */ 52de76d2a4SMichael Klier var $showMonth = ''; 53de76d2a4SMichael Klier 54de76d2a4SMichael Klier /** 55de76d2a4SMichael Klier * the year to show 56de76d2a4SMichael Klier */ 57de76d2a4SMichael Klier var $showYear = ''; 58de76d2a4SMichael Klier 59de76d2a4SMichael Klier /** 60de76d2a4SMichael Klier * the global timestamp for date-operations 61de76d2a4SMichael Klier */ 62de76d2a4SMichael Klier var $gTimestamp = ''; 63de76d2a4SMichael Klier 64de76d2a4SMichael Klier /** 65de76d2a4SMichael Klier * number days of the current month 66de76d2a4SMichael Klier */ 67de76d2a4SMichael Klier var $numDays = ''; 68de76d2a4SMichael Klier 69de76d2a4SMichael Klier /** 70de76d2a4SMichael Klier * date-date to generate the calendar 71de76d2a4SMichael Klier */ 72de76d2a4SMichael Klier var $viewDate = array(); 73de76d2a4SMichael Klier 74de76d2a4SMichael Klier /** 75de76d2a4SMichael Klier * return some info 76de76d2a4SMichael Klier */ 77de76d2a4SMichael Klier function getInfo(){ 78de76d2a4SMichael Klier return array( 79de76d2a4SMichael Klier 'author' => 'Michael Klier (chi)', 80de76d2a4SMichael Klier 'email' => 'chi@chimeric.de', 81de76d2a4SMichael Klier 'date' => @file_get_contents(DOKU_PLUGIN.'wikicalendar/VERSION'), 82de76d2a4SMichael Klier 'name' => 'WikiCalendar Plugin', 83de76d2a4SMichael Klier 'desc' => 'Implements a simple Calendar with links to wikipages.', 84de76d2a4SMichael Klier 'url' => 'http://dokuwiki.org/plugin:wikicalendar' 85de76d2a4SMichael Klier ); 86de76d2a4SMichael Klier } 87de76d2a4SMichael Klier 88de76d2a4SMichael Klier /** 89de76d2a4SMichael Klier * Some Information first. 90de76d2a4SMichael Klier */ 91de76d2a4SMichael Klier function getType() { return 'substition'; } 92de76d2a4SMichael Klier function getPType() { return 'block'; } 93de76d2a4SMichael Klier function getSort() { return 125; } 94de76d2a4SMichael Klier 95de76d2a4SMichael Klier /** 96de76d2a4SMichael Klier * Connect pattern to lexer 97de76d2a4SMichael Klier */ 98de76d2a4SMichael Klier function connectTo($mode) { 99de76d2a4SMichael Klier $this->Lexer->addSpecialPattern('{{cal>.+?}}',$mode,'plugin_wikicalendar'); 100de76d2a4SMichael Klier } 101de76d2a4SMichael Klier 102de76d2a4SMichael Klier /** 103de76d2a4SMichael Klier * Handle the match 104de76d2a4SMichael Klier */ 105de76d2a4SMichael Klier function handle($match, $state, $pos, &$handler){ 106de76d2a4SMichael Klier $match = substr($match,6,-2); 107de76d2a4SMichael Klier return array($match); 108de76d2a4SMichael Klier } 109de76d2a4SMichael Klier 110de76d2a4SMichael Klier /** 111de76d2a4SMichael Klier * Create output 112de76d2a4SMichael Klier */ 113de76d2a4SMichael Klier function render($mode, &$renderer, $data) { 114de76d2a4SMichael Klier global $ID; 115de76d2a4SMichael Klier 116de76d2a4SMichael Klier // define some variables first 117de76d2a4SMichael Klier $this->calendar_ns = ($data[0]) ? $data[0] : $ID; 118de76d2a4SMichael Klier $this->langDays = $this->getLang('days'); 119de76d2a4SMichael Klier $this->langMonth = $this->getLang('month'); 120de76d2a4SMichael Klier $this->curDate = getdate(time()); 121de76d2a4SMichael Klier $this->showMonth = (is_numeric($_REQUEST['plugin_wikicalendar_month'])) ? $_REQUEST['plugin_wikicalendar_month'] : $this->curDate['mon']; 122de76d2a4SMichael Klier $this->showYear = (is_numeric($_REQUEST['plugin_wikicalendar_year'])) ? $_REQUEST['plugin_wikicalendar_year'] : $this->curDate['year']; 123de76d2a4SMichael Klier $this->gTimestamp = mktime(0,0,0,$this->showMonth,1,$this->showYear); 124de76d2a4SMichael Klier $this->numDays = date('t',$this->gTimestamp); 125de76d2a4SMichael Klier $this->viewDate = getdate($this->gTimestamp); 126de76d2a4SMichael Klier $this->today = ($this->viewDate['mon'] == $this->curDate['mon'] && 127de76d2a4SMichael Klier $this->viewDate['year'] == $this->curDate['year']) ? 128de76d2a4SMichael Klier $this->curDate['mday'] : null; 129de76d2a4SMichael Klier $this->month_ns = $this->calendar_ns.':'.$this->showYear.':'.$this->showMonth; 130de76d2a4SMichael Klier $this->MonthStart = ($this->viewDate['wday'] == 0) ? 7 : $this->viewDate['wday']; 131de76d2a4SMichael Klier 132de76d2a4SMichael Klier if($mode == 'xhtml'){ 133de76d2a4SMichael Klier // turn off caching 134de76d2a4SMichael Klier $renderer->info['cache'] = false; 135de76d2a4SMichael Klier 136de76d2a4SMichael Klier $renderer->doc .= '<div class="plugin_wikicalendar">' . DOKU_LF; 137de76d2a4SMichael Klier $renderer->doc .= $this->_month_xhtml(); 138de76d2a4SMichael Klier $renderer->doc .= $this->_form_go2(); 139de76d2a4SMichael Klier $renderer->doc .= '</div>' . DOKU_LF; 140de76d2a4SMichael Klier 141de76d2a4SMichael Klier return true; 142de76d2a4SMichael Klier } 143de76d2a4SMichael Klier return false; 144de76d2a4SMichael Klier } 145de76d2a4SMichael Klier 146de76d2a4SMichael Klier /** 147de76d2a4SMichael Klier * Renders the Calendar (month-view) 148de76d2a4SMichael Klier * 149de76d2a4SMichael Klier * @author Michael Klier <chi@chimeric.de> 150de76d2a4SMichael Klier */ 151de76d2a4SMichael Klier function _month_xhtml() { 152de76d2a4SMichael Klier global $ID; 153de76d2a4SMichael Klier 154de76d2a4SMichael Klier $script = script(); 155de76d2a4SMichael Klier 156de76d2a4SMichael Klier $prevMonth = ($this->showMonth-1 > 0) ? ($this->showMonth-1) : 12; 157de76d2a4SMichael Klier $nextMonth = ($this->showMonth+1 < 13) ? ($this->showMonth+1) : 1; 158de76d2a4SMichael Klier 159de76d2a4SMichael Klier switch(true) { 160de76d2a4SMichael Klier case($prevMonth == 12): 161de76d2a4SMichael Klier $prevYear = ($this->showYear-1); 162de76d2a4SMichael Klier $nextYear = $this->showYear; 163de76d2a4SMichael Klier break; 164de76d2a4SMichael Klier case($nextMonth == 1): 165de76d2a4SMichael Klier $nextYear = ($this->showYear+1); 166de76d2a4SMichael Klier $prevYear = $this->showYear; 167de76d2a4SMichael Klier break; 168de76d2a4SMichael Klier default: 169de76d2a4SMichael Klier $prevYear = $this->showYear; 170de76d2a4SMichael Klier $nextYear = $this->showYear; 171de76d2a4SMichael Klier break; 172de76d2a4SMichael Klier } 173de76d2a4SMichael Klier 174de76d2a4SMichael Klier // create calendar-header 175de76d2a4SMichael Klier $out .= <<<CALHEAD 176de76d2a4SMichael Klier<table class="plugin_wikicalendar"> 177de76d2a4SMichael Klier <tr> 178de76d2a4SMichael Klier <th class="month"> 179de76d2a4SMichael Klier <form action="{$script}" method="post" class="prevnext"> 180de76d2a4SMichael Klier <input type="hidden" name="id" value="{$ID}" /> 181de76d2a4SMichael Klier <input type="hidden" name="plugin_wikicalendar_year" value="{$prevYear}" /> 182de76d2a4SMichael Klier <input type="hidden" name="plugin_wikicalendar_month" value="{$prevMonth}" /> 183de76d2a4SMichael Klier <input type="submit" class="btn_prev_month" name="submit" value="←" accesskey="P" title="{$this->langMonth[$prevMonth]} {$prevYear}" /> 184de76d2a4SMichael Klier </form> 185de76d2a4SMichael Klier </th> 186de76d2a4SMichael Klier <th class="blank"> </th> 187de76d2a4SMichael Klier <th class="blank"> </th> 188de76d2a4SMichael Klier <th class="month">{$this->langMonth[$this->viewDate['mon']]}<br />{$this->showYear}<br /></th> 189de76d2a4SMichael Klier <th class="blank"> </th> 190de76d2a4SMichael Klier <th class="blank"> </th> 191de76d2a4SMichael Klier <th class="month"> 192de76d2a4SMichael Klier <form action="{$script}" method="post" class="prevnext"> 193de76d2a4SMichael Klier <input type="hidden" name="id" value="{$ID}" /> 194de76d2a4SMichael Klier <input type="hidden" name="plugin_wikicalendar_year" value="{$nextYear}" /> 195de76d2a4SMichael Klier <input type="hidden" name="plugin_wikicalendar_month" value="{$nextMonth}" /> 196de76d2a4SMichael Klier <input type="submit" class="btn_next_month" name="submit" value="→" accesskey="N" title="{$this->langMonth[$nextMonth]} {$nextYear}" /> 197de76d2a4SMichael Klier </form> 198de76d2a4SMichael Klier </th> 199de76d2a4SMichael Klier </tr> 200de76d2a4SMichael KlierCALHEAD; 201de76d2a4SMichael Klier 202de76d2a4SMichael Klier // create calendar weekday-headers 203de76d2a4SMichael Klier $out .= "<tr>"; 204de76d2a4SMichael Klier foreach($this->langDays as $day) { 205de76d2a4SMichael Klier $out .= '<td class="weekday">'.$day.'</td>'; 206de76d2a4SMichael Klier } 207de76d2a4SMichael Klier $out .= "</tr>\n"; 208de76d2a4SMichael Klier 209de76d2a4SMichael Klier // create calendar-body 210de76d2a4SMichael Klier for($i=1;$i<=$this->numDays;$i++) { 211de76d2a4SMichael Klier $day = $i; 212de76d2a4SMichael Klier //set day-wikipage 213de76d2a4SMichael Klier $dayWP = $this->month_ns.':'.$day; 214de76d2a4SMichael Klier // close row at end of week 215de76d2a4SMichael Klier if($wd == 7) $out .= '</tr>'; 216de76d2a4SMichael Klier // set weekday 217de76d2a4SMichael Klier if(!isset($wd) or $wd == 7) { $wd = 0; } 218de76d2a4SMichael Klier // start new row when new week starts 219de76d2a4SMichael Klier if($wd == 0) $out .= '<tr>'; 220de76d2a4SMichael Klier 221de76d2a4SMichael Klier // create blank fields up to the first day of the month 222de76d2a4SMichael Klier if(!$this->firstWeek) { 223de76d2a4SMichael Klier while($wd < ($this->MonthStart-1)) { 224de76d2a4SMichael Klier $out .= '<td class="blank"> </td>'; 225de76d2a4SMichael Klier $wd++; 226de76d2a4SMichael Klier } 227de76d2a4SMichael Klier // ok - first week is printet 228de76d2a4SMichael Klier $this->firstWeek = true; 229de76d2a4SMichael Klier } 230de76d2a4SMichael Klier 231de76d2a4SMichael Klier // check for today 232de76d2a4SMichael Klier if($this->today == $day) { 233de76d2a4SMichael Klier $out .= '<td class="today">'.$this->_calendar_day($dayWP,$day).'</td>'; 234de76d2a4SMichael Klier } else { 235de76d2a4SMichael Klier $out .= '<td class="day">'.$this->_calendar_day($dayWP,$day).'</td>'; 236de76d2a4SMichael Klier } 237de76d2a4SMichael Klier 238de76d2a4SMichael Klier // fill remaining days with blanks 239de76d2a4SMichael Klier if($i == $this->numDays && $wd < 7) { 240de76d2a4SMichael Klier while($wd<7) { 241de76d2a4SMichael Klier $out .= '<td class="blank"> </td>'; 242de76d2a4SMichael Klier $wd++; 243de76d2a4SMichael Klier } 244de76d2a4SMichael Klier $out .= '</tr>'; 245de76d2a4SMichael Klier } 246de76d2a4SMichael Klier 247de76d2a4SMichael Klier // dont forget to count weekdays 248de76d2a4SMichael Klier $wd++; 249de76d2a4SMichael Klier } 250de76d2a4SMichael Klier 251de76d2a4SMichael Klier // finally close the table 252de76d2a4SMichael Klier $out .= '</table>'; 253de76d2a4SMichael Klier 254de76d2a4SMichael Klier return ($out); 255de76d2a4SMichael Klier } 256de76d2a4SMichael Klier 257de76d2a4SMichael Klier /** 258de76d2a4SMichael Klier * Generates the content of each day in the calendar-table. 259de76d2a4SMichael Klier * 260de76d2a4SMichael Klier * @author Michael Klier <chi@chimeric.de> 261de76d2a4SMichael Klier */ 262de76d2a4SMichael Klier function _calendar_day($wp, $day) { 263de76d2a4SMichael Klier global $lang; 264de76d2a4SMichael Klier global $ID; 265de76d2a4SMichael Klier 266de76d2a4SMichael Klier if(file_exists(wikiFN($wp))) { 267de76d2a4SMichael Klier $out .= '<div class="isevent">'; 268de76d2a4SMichael Klier if(auth_quickaclcheck($wp) >= AUTH_READ) { 269de76d2a4SMichael Klier $out .= '<a href="' . wl($wp, array('do' => 'edit', 'plugin_wikicalendar_redirect_id' => $ID, 'plugin_wikicalendar_month' => $this->showMonth, 'plugin_wikicalendar_year' => $this->showYear)) . '" class="plugin_wikicalendar_btn" title="' . $lang['btn_edit'] . '">✍</a>' . DOKU_LF; 270de76d2a4SMichael Klier } 271de76d2a4SMichael Klier $out .= '<div class="day_num"><a href="' . wl($wp) . '" class="wikilink1" title="' . $wp . '">'.$day.'</a></div>'; 272de76d2a4SMichael Klier $out .= '<div class="abstract">' . p_get_metadata($wp, 'description abstract') . '</div>' . DOKU_LF; 273de76d2a4SMichael Klier } else { 274de76d2a4SMichael Klier $out .= '<div class="noevent">'; 275de76d2a4SMichael Klier if(auth_quickaclcheck($wp) >= AUTH_CREATE) { 276de76d2a4SMichael Klier //$out .= $this->_btn_add_day($wp); 277de76d2a4SMichael Klier $out .= '<a href="' . wl($wp, array('do' => 'edit', 'plugin_wikicalendar_redirect_id' => $ID, 'plugin_wikicalendar_month' => $this->showMonth, 'plugin_wikicalendar_year' => $this->showYear)) . '" class="plugin_wikicalendar_btn" title="' . $lang['btn_create'] . '">✍</a>' . DOKU_LF; 278de76d2a4SMichael Klier } 279de76d2a4SMichael Klier $out .= '<div class="day_num">'.$day.'</div>'; 280de76d2a4SMichael Klier } 281de76d2a4SMichael Klier $out .= '</div>'; 282de76d2a4SMichael Klier return ($out); 283de76d2a4SMichael Klier } 284de76d2a4SMichael Klier 285de76d2a4SMichael Klier /** 286de76d2a4SMichael Klier * Generates a From to jump to selected dates 287de76d2a4SMichael Klier * 288de76d2a4SMichael Klier * @author Michael Klier <chi@chimeric.de> 289de76d2a4SMichael Klier */ 290de76d2a4SMichael Klier function _form_go2() { 291de76d2a4SMichael Klier global $ID; 292de76d2a4SMichael Klier 293de76d2a4SMichael Klier $out .= '<table class="inline plugin_wikicalendar_go2">' . DOKU_LF; 294de76d2a4SMichael Klier 295de76d2a4SMichael Klier $out .= '<form action="'.script().'" method="post">' . DOKU_LF; 296de76d2a4SMichael Klier $out .= '<tr class="default">' . DOKU_LF; 297de76d2a4SMichael Klier $out .= '<td><label>'.$this->getLang('year').':</label></td>' . DOKU_LF; 298de76d2a4SMichael Klier $out .= '<td><div class="input">' . DOKU_LF; 299de76d2a4SMichael Klier $out .= '<select id="year" name="plugin_wikicalendar_year">' . DOKU_LF; 300de76d2a4SMichael Klier 301de76d2a4SMichael Klier $year_start = ($this->showYear != $this->curDate['year']) ? $this->showYear - 10 : $this->curDate['year'] - 5; 302de76d2a4SMichael Klier $year_end = $this->showYear + 10; 303de76d2a4SMichael Klier 304de76d2a4SMichael Klier for($i=$year_start;$i<=$year_end;$i++) { 305de76d2a4SMichael Klier if($i == $this->showYear || $i == $this->curDate['year']) { 306de76d2a4SMichael Klier $out .= '<option value="'.$i.'" selected="selected">'.$i.'</option>' . DOKU_LF; 307de76d2a4SMichael Klier } else { 308de76d2a4SMichael Klier $out .= '<option value="'.$i.'">'.$i.'</option>' . DOKU_LF; 309de76d2a4SMichael Klier } 310de76d2a4SMichael Klier } 311de76d2a4SMichael Klier 312de76d2a4SMichael Klier $out .= '</select>' . DOKU_LF; 313de76d2a4SMichael Klier $out .= '</div>' . DOKU_LF; 314de76d2a4SMichael Klier $out .= '</td>' . DOKU_LF; 315de76d2a4SMichael Klier $out .= '<td><label>'.$this->getLang('mon').':</label></td>' . DOKU_LF; 316de76d2a4SMichael Klier $out .= '<td><div class="input">' . DOKU_LF; 317de76d2a4SMichael Klier $out .= '<select id="month" name="plugin_wikicalendar_month">' . DOKU_LF; 318de76d2a4SMichael Klier 319*59e8a14bSMichael Klier for($i=1;$i<=12;$i++) { 320de76d2a4SMichael Klier if($i == $this->showMonth) { 321de76d2a4SMichael Klier $out .= '<option value="'.$i.'" selected="selected">'.$this->langMonth[$i].'</option>' . DOKU_LF; 322de76d2a4SMichael Klier } else { 323de76d2a4SMichael Klier $out .= '<option value="'.$i.'">'.$this->langMonth[$i].'</option>' . DOKU_LF; 324de76d2a4SMichael Klier } 325de76d2a4SMichael Klier } 326de76d2a4SMichael Klier 327de76d2a4SMichael Klier $out .= '</select>' . DOKU_LF; 328de76d2a4SMichael Klier $out .= '</div>' . DOKU_LF; 329de76d2a4SMichael Klier $out .= '</td>' . DOKU_LF; 330de76d2a4SMichael Klier $out .= '<td><input type="hidden" name="id" value="'.$ID.'" />' . DOKU_LF; 331de76d2a4SMichael Klier $out .= '<input type="submit" class="button" name="go2" value="'.$this->getLang('go').'" />' . DOKU_LF; 332de76d2a4SMichael Klier $out .= '</form>' . DOKU_LF; 333de76d2a4SMichael Klier 334de76d2a4SMichael Klier if($this->showYear != $this->curDate['year'] or $this->showMonth != $this->curDate['mon']) { 335de76d2a4SMichael Klier $out .= '<form action="'.script().'" method="post" class="go2" onsubmit="">' . DOKU_LF; 336de76d2a4SMichael Klier $out .= '<input type="hidden" name="id" value="'.$ID.'" />' . DOKU_LF; 337de76d2a4SMichael Klier $out .= '<input type="submit" class="button" name="back2cur" value="'.$this->getLang('current').'" />' . DOKU_LF; 338de76d2a4SMichael Klier $out .= '</form>' . DOKU_LF; 339de76d2a4SMichael Klier } else { 340de76d2a4SMichael Klier $out .= '</td></tr>' . DOKU_LF; 341de76d2a4SMichael Klier } 342de76d2a4SMichael Klier 343de76d2a4SMichael Klier $out .= '</table>' . DOKU_LF; 344de76d2a4SMichael Klier 345de76d2a4SMichael Klier return ($out); 346de76d2a4SMichael Klier } 347de76d2a4SMichael Klier} 348de76d2a4SMichael Klier//Setup Vim: tabstop=4 enc=utf8 349