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; 1156d279233SMichael Klier global $conf; 116de76d2a4SMichael Klier 117de76d2a4SMichael Klier // define some variables first 118de76d2a4SMichael Klier $this->calendar_ns = ($data[0]) ? $data[0] : $ID; 119de76d2a4SMichael Klier $this->langDays = $this->getLang('days'); 120de76d2a4SMichael Klier $this->langMonth = $this->getLang('month'); 121de76d2a4SMichael Klier $this->curDate = getdate(time()); 122de76d2a4SMichael Klier $this->showMonth = (is_numeric($_REQUEST['plugin_wikicalendar_month'])) ? $_REQUEST['plugin_wikicalendar_month'] : $this->curDate['mon']; 123de76d2a4SMichael Klier $this->showYear = (is_numeric($_REQUEST['plugin_wikicalendar_year'])) ? $_REQUEST['plugin_wikicalendar_year'] : $this->curDate['year']; 124de76d2a4SMichael Klier $this->gTimestamp = mktime(0,0,0,$this->showMonth,1,$this->showYear); 125de76d2a4SMichael Klier $this->numDays = date('t',$this->gTimestamp); 126de76d2a4SMichael Klier $this->viewDate = getdate($this->gTimestamp); 127de76d2a4SMichael Klier $this->today = ($this->viewDate['mon'] == $this->curDate['mon'] && 128de76d2a4SMichael Klier $this->viewDate['year'] == $this->curDate['year']) ? 129de76d2a4SMichael Klier $this->curDate['mday'] : null; 1306d279233SMichael Klier 1316d279233SMichael Klier // if month directory exists we keep the old scheme 1326d279233SMichael Klier if(is_dir($conf['datadir'].'/'.str_replace(':','/',$this->calendar_ns.':'.$this->showYear.':'.$this->showMonth))) { 133de76d2a4SMichael Klier $this->month_ns = $this->calendar_ns.':'.$this->showYear.':'.$this->showMonth; 1346d279233SMichael Klier } else { 1356d279233SMichael Klier if($this->showMonth < 10) { 1366d279233SMichael Klier $this->month_ns = $this->calendar_ns.':'.$this->showYear.':0'.$this->showMonth; 1376d279233SMichael Klier } else { 1386d279233SMichael Klier $this->month_ns = $this->calendar_ns.':'.$this->showYear.':'.$this->showMonth; 1396d279233SMichael Klier } 1406d279233SMichael Klier } 1416d279233SMichael Klier 142de76d2a4SMichael Klier $this->MonthStart = ($this->viewDate['wday'] == 0) ? 7 : $this->viewDate['wday']; 143de76d2a4SMichael Klier 144de76d2a4SMichael Klier if($mode == 'xhtml'){ 145de76d2a4SMichael Klier // turn off caching 146de76d2a4SMichael Klier $renderer->info['cache'] = false; 147de76d2a4SMichael Klier 148de76d2a4SMichael Klier $renderer->doc .= '<div class="plugin_wikicalendar">' . DOKU_LF; 149de76d2a4SMichael Klier $renderer->doc .= $this->_month_xhtml(); 150de76d2a4SMichael Klier $renderer->doc .= $this->_form_go2(); 151de76d2a4SMichael Klier $renderer->doc .= '</div>' . DOKU_LF; 152de76d2a4SMichael Klier 153de76d2a4SMichael Klier return true; 154de76d2a4SMichael Klier } 155de76d2a4SMichael Klier return false; 156de76d2a4SMichael Klier } 157de76d2a4SMichael Klier 158de76d2a4SMichael Klier /** 159de76d2a4SMichael Klier * Renders the Calendar (month-view) 160de76d2a4SMichael Klier * 161de76d2a4SMichael Klier * @author Michael Klier <chi@chimeric.de> 162de76d2a4SMichael Klier */ 163de76d2a4SMichael Klier function _month_xhtml() { 164de76d2a4SMichael Klier global $ID; 165de76d2a4SMichael Klier 166de76d2a4SMichael Klier $script = script(); 167de76d2a4SMichael Klier 168de76d2a4SMichael Klier $prevMonth = ($this->showMonth-1 > 0) ? ($this->showMonth-1) : 12; 169de76d2a4SMichael Klier $nextMonth = ($this->showMonth+1 < 13) ? ($this->showMonth+1) : 1; 170de76d2a4SMichael Klier 171de76d2a4SMichael Klier switch(true) { 172de76d2a4SMichael Klier case($prevMonth == 12): 173de76d2a4SMichael Klier $prevYear = ($this->showYear-1); 174de76d2a4SMichael Klier $nextYear = $this->showYear; 175de76d2a4SMichael Klier break; 176de76d2a4SMichael Klier case($nextMonth == 1): 177de76d2a4SMichael Klier $nextYear = ($this->showYear+1); 178de76d2a4SMichael Klier $prevYear = $this->showYear; 179de76d2a4SMichael Klier break; 180de76d2a4SMichael Klier default: 181de76d2a4SMichael Klier $prevYear = $this->showYear; 182de76d2a4SMichael Klier $nextYear = $this->showYear; 183de76d2a4SMichael Klier break; 184de76d2a4SMichael Klier } 185de76d2a4SMichael Klier 186de76d2a4SMichael Klier // create calendar-header 187de76d2a4SMichael Klier $out .= <<<CALHEAD 188de76d2a4SMichael Klier<table class="plugin_wikicalendar"> 189de76d2a4SMichael Klier <tr> 190de76d2a4SMichael Klier <th class="month"> 191de76d2a4SMichael Klier <form action="{$script}" method="post" class="prevnext"> 192de76d2a4SMichael Klier <input type="hidden" name="id" value="{$ID}" /> 193de76d2a4SMichael Klier <input type="hidden" name="plugin_wikicalendar_year" value="{$prevYear}" /> 194de76d2a4SMichael Klier <input type="hidden" name="plugin_wikicalendar_month" value="{$prevMonth}" /> 195de76d2a4SMichael Klier <input type="submit" class="btn_prev_month" name="submit" value="←" accesskey="P" title="{$this->langMonth[$prevMonth]} {$prevYear}" /> 196de76d2a4SMichael Klier </form> 197de76d2a4SMichael Klier </th> 198de76d2a4SMichael Klier <th class="blank"> </th> 199de76d2a4SMichael Klier <th class="blank"> </th> 200de76d2a4SMichael Klier <th class="month">{$this->langMonth[$this->viewDate['mon']]}<br />{$this->showYear}<br /></th> 201de76d2a4SMichael Klier <th class="blank"> </th> 202de76d2a4SMichael Klier <th class="blank"> </th> 203de76d2a4SMichael Klier <th class="month"> 204de76d2a4SMichael Klier <form action="{$script}" method="post" class="prevnext"> 205de76d2a4SMichael Klier <input type="hidden" name="id" value="{$ID}" /> 206de76d2a4SMichael Klier <input type="hidden" name="plugin_wikicalendar_year" value="{$nextYear}" /> 207de76d2a4SMichael Klier <input type="hidden" name="plugin_wikicalendar_month" value="{$nextMonth}" /> 208de76d2a4SMichael Klier <input type="submit" class="btn_next_month" name="submit" value="→" accesskey="N" title="{$this->langMonth[$nextMonth]} {$nextYear}" /> 209de76d2a4SMichael Klier </form> 210de76d2a4SMichael Klier </th> 211de76d2a4SMichael Klier </tr> 212de76d2a4SMichael KlierCALHEAD; 213de76d2a4SMichael Klier 214de76d2a4SMichael Klier // create calendar weekday-headers 215de76d2a4SMichael Klier $out .= "<tr>"; 216*5d6390e4SMichael Klier if($this->getConf('weekstart') == 'Sunday') { 217*5d6390e4SMichael Klier $last = array_pop($this->langDays); 218*5d6390e4SMichael Klier array_unshift($this->langDays, $last); 219*5d6390e4SMichael Klier } 220de76d2a4SMichael Klier foreach($this->langDays as $day) { 221de76d2a4SMichael Klier $out .= '<td class="weekday">'.$day.'</td>'; 222de76d2a4SMichael Klier } 223de76d2a4SMichael Klier $out .= "</tr>\n"; 224de76d2a4SMichael Klier 225de76d2a4SMichael Klier // create calendar-body 226de76d2a4SMichael Klier for($i=1;$i<=$this->numDays;$i++) { 227de76d2a4SMichael Klier $day = $i; 2286d279233SMichael Klier //set day-wikipage - use leading zeros on new pages 2296d279233SMichael Klier if($day < 10) { 2306d279233SMichael Klier if(page_exists($this->month_ns.':'.$day)) { 231de76d2a4SMichael Klier $dayWP = $this->month_ns.':'.$day; 2326d279233SMichael Klier } else { 2336d279233SMichael Klier $dayWP = $this->month_ns.':0'.$day; 2346d279233SMichael Klier } 2356d279233SMichael Klier } else { 2366d279233SMichael Klier $dayWP = $this->month_ns.':'.$day; 2376d279233SMichael Klier } 238de76d2a4SMichael Klier // close row at end of week 239de76d2a4SMichael Klier if($wd == 7) $out .= '</tr>'; 240de76d2a4SMichael Klier // set weekday 241de76d2a4SMichael Klier if(!isset($wd) or $wd == 7) { $wd = 0; } 242de76d2a4SMichael Klier // start new row when new week starts 243de76d2a4SMichael Klier if($wd == 0) $out .= '<tr>'; 244de76d2a4SMichael Klier 245de76d2a4SMichael Klier // create blank fields up to the first day of the month 246*5d6390e4SMichael Klier $offset = ($this->getConf('weekstart') == 'Sunday') ? 0 : 1; 247de76d2a4SMichael Klier if(!$this->firstWeek) { 248*5d6390e4SMichael Klier while($wd < ($this->MonthStart - $offset)) { 249de76d2a4SMichael Klier $out .= '<td class="blank"> </td>'; 250de76d2a4SMichael Klier $wd++; 251de76d2a4SMichael Klier } 252de76d2a4SMichael Klier // ok - first week is printet 253de76d2a4SMichael Klier $this->firstWeek = true; 254de76d2a4SMichael Klier } 255de76d2a4SMichael Klier 256de76d2a4SMichael Klier // check for today 257de76d2a4SMichael Klier if($this->today == $day) { 258de76d2a4SMichael Klier $out .= '<td class="today">'.$this->_calendar_day($dayWP,$day).'</td>'; 259de76d2a4SMichael Klier } else { 260de76d2a4SMichael Klier $out .= '<td class="day">'.$this->_calendar_day($dayWP,$day).'</td>'; 261de76d2a4SMichael Klier } 262de76d2a4SMichael Klier 263de76d2a4SMichael Klier // fill remaining days with blanks 264de76d2a4SMichael Klier if($i == $this->numDays && $wd < 7) { 265de76d2a4SMichael Klier while($wd<7) { 266de76d2a4SMichael Klier $out .= '<td class="blank"> </td>'; 267de76d2a4SMichael Klier $wd++; 268de76d2a4SMichael Klier } 269de76d2a4SMichael Klier $out .= '</tr>'; 270de76d2a4SMichael Klier } 271de76d2a4SMichael Klier 272de76d2a4SMichael Klier // dont forget to count weekdays 273de76d2a4SMichael Klier $wd++; 274de76d2a4SMichael Klier } 275de76d2a4SMichael Klier 276de76d2a4SMichael Klier // finally close the table 277de76d2a4SMichael Klier $out .= '</table>'; 278de76d2a4SMichael Klier 279de76d2a4SMichael Klier return ($out); 280de76d2a4SMichael Klier } 281de76d2a4SMichael Klier 282de76d2a4SMichael Klier /** 283de76d2a4SMichael Klier * Generates the content of each day in the calendar-table. 284de76d2a4SMichael Klier * 285de76d2a4SMichael Klier * @author Michael Klier <chi@chimeric.de> 286de76d2a4SMichael Klier */ 287de76d2a4SMichael Klier function _calendar_day($wp, $day) { 288de76d2a4SMichael Klier global $lang; 289de76d2a4SMichael Klier global $ID; 290de76d2a4SMichael Klier 291de76d2a4SMichael Klier if(file_exists(wikiFN($wp))) { 292de76d2a4SMichael Klier $out .= '<div class="isevent">'; 293de76d2a4SMichael Klier if(auth_quickaclcheck($wp) >= AUTH_READ) { 294de76d2a4SMichael 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; 295de76d2a4SMichael Klier } 296de76d2a4SMichael Klier $out .= '<div class="day_num"><a href="' . wl($wp) . '" class="wikilink1" title="' . $wp . '">'.$day.'</a></div>'; 297de76d2a4SMichael Klier $out .= '<div class="abstract">' . p_get_metadata($wp, 'description abstract') . '</div>' . DOKU_LF; 298de76d2a4SMichael Klier } else { 299de76d2a4SMichael Klier $out .= '<div class="noevent">'; 300de76d2a4SMichael Klier if(auth_quickaclcheck($wp) >= AUTH_CREATE) { 301de76d2a4SMichael Klier //$out .= $this->_btn_add_day($wp); 302de76d2a4SMichael 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; 303de76d2a4SMichael Klier } 304de76d2a4SMichael Klier $out .= '<div class="day_num">'.$day.'</div>'; 305de76d2a4SMichael Klier } 306de76d2a4SMichael Klier $out .= '</div>'; 307de76d2a4SMichael Klier return ($out); 308de76d2a4SMichael Klier } 309de76d2a4SMichael Klier 310de76d2a4SMichael Klier /** 311de76d2a4SMichael Klier * Generates a From to jump to selected dates 312de76d2a4SMichael Klier * 313de76d2a4SMichael Klier * @author Michael Klier <chi@chimeric.de> 314de76d2a4SMichael Klier */ 315de76d2a4SMichael Klier function _form_go2() { 316de76d2a4SMichael Klier global $ID; 317de76d2a4SMichael Klier 318de76d2a4SMichael Klier $out .= '<table class="inline plugin_wikicalendar_go2">' . DOKU_LF; 319de76d2a4SMichael Klier 320de76d2a4SMichael Klier $out .= '<form action="'.script().'" method="post">' . DOKU_LF; 321de76d2a4SMichael Klier $out .= '<tr class="default">' . DOKU_LF; 322de76d2a4SMichael Klier $out .= '<td><label>'.$this->getLang('year').':</label></td>' . DOKU_LF; 323de76d2a4SMichael Klier $out .= '<td><div class="input">' . DOKU_LF; 324de76d2a4SMichael Klier $out .= '<select id="year" name="plugin_wikicalendar_year">' . DOKU_LF; 325de76d2a4SMichael Klier 326de76d2a4SMichael Klier $year_start = ($this->showYear != $this->curDate['year']) ? $this->showYear - 10 : $this->curDate['year'] - 5; 327de76d2a4SMichael Klier $year_end = $this->showYear + 10; 328de76d2a4SMichael Klier 329de76d2a4SMichael Klier for($i=$year_start;$i<=$year_end;$i++) { 330de76d2a4SMichael Klier if($i == $this->showYear || $i == $this->curDate['year']) { 331de76d2a4SMichael Klier $out .= '<option value="'.$i.'" selected="selected">'.$i.'</option>' . DOKU_LF; 332de76d2a4SMichael Klier } else { 333de76d2a4SMichael Klier $out .= '<option value="'.$i.'">'.$i.'</option>' . DOKU_LF; 334de76d2a4SMichael Klier } 335de76d2a4SMichael Klier } 336de76d2a4SMichael Klier 337de76d2a4SMichael Klier $out .= '</select>' . DOKU_LF; 338de76d2a4SMichael Klier $out .= '</div>' . DOKU_LF; 339de76d2a4SMichael Klier $out .= '</td>' . DOKU_LF; 340de76d2a4SMichael Klier $out .= '<td><label>'.$this->getLang('mon').':</label></td>' . DOKU_LF; 341de76d2a4SMichael Klier $out .= '<td><div class="input">' . DOKU_LF; 342de76d2a4SMichael Klier $out .= '<select id="month" name="plugin_wikicalendar_month">' . DOKU_LF; 343de76d2a4SMichael Klier 34459e8a14bSMichael Klier for($i=1;$i<=12;$i++) { 345de76d2a4SMichael Klier if($i == $this->showMonth) { 346de76d2a4SMichael Klier $out .= '<option value="'.$i.'" selected="selected">'.$this->langMonth[$i].'</option>' . DOKU_LF; 347de76d2a4SMichael Klier } else { 348de76d2a4SMichael Klier $out .= '<option value="'.$i.'">'.$this->langMonth[$i].'</option>' . DOKU_LF; 349de76d2a4SMichael Klier } 350de76d2a4SMichael Klier } 351de76d2a4SMichael Klier 352de76d2a4SMichael Klier $out .= '</select>' . DOKU_LF; 353de76d2a4SMichael Klier $out .= '</div>' . DOKU_LF; 354de76d2a4SMichael Klier $out .= '</td>' . DOKU_LF; 355de76d2a4SMichael Klier $out .= '<td><input type="hidden" name="id" value="'.$ID.'" />' . DOKU_LF; 356de76d2a4SMichael Klier $out .= '<input type="submit" class="button" name="go2" value="'.$this->getLang('go').'" />' . DOKU_LF; 357de76d2a4SMichael Klier $out .= '</form>' . DOKU_LF; 358de76d2a4SMichael Klier 359de76d2a4SMichael Klier if($this->showYear != $this->curDate['year'] or $this->showMonth != $this->curDate['mon']) { 360de76d2a4SMichael Klier $out .= '<form action="'.script().'" method="post" class="go2" onsubmit="">' . DOKU_LF; 361de76d2a4SMichael Klier $out .= '<input type="hidden" name="id" value="'.$ID.'" />' . DOKU_LF; 362de76d2a4SMichael Klier $out .= '<input type="submit" class="button" name="back2cur" value="'.$this->getLang('current').'" />' . DOKU_LF; 363de76d2a4SMichael Klier $out .= '</form>' . DOKU_LF; 364de76d2a4SMichael Klier } else { 365de76d2a4SMichael Klier $out .= '</td></tr>' . DOKU_LF; 366de76d2a4SMichael Klier } 367de76d2a4SMichael Klier 368de76d2a4SMichael Klier $out .= '</table>' . DOKU_LF; 369de76d2a4SMichael Klier 370de76d2a4SMichael Klier return ($out); 371de76d2a4SMichael Klier } 372de76d2a4SMichael Klier} 373de76d2a4SMichael Klier//Setup Vim: tabstop=4 enc=utf8 374