1*6fbb086dSAndreas Boehler<?php 2*6fbb086dSAndreas Boehler/** 3*6fbb086dSAndreas Boehler * DokuWiki Plugin DAVCal (Table Syntax Component) 4*6fbb086dSAndreas Boehler * 5*6fbb086dSAndreas Boehler * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6*6fbb086dSAndreas Boehler * @author Andreas Böhler <dev@aboehler.at> 7*6fbb086dSAndreas Boehler */ 8*6fbb086dSAndreas Boehler 9*6fbb086dSAndreas Boehler// must be run within Dokuwiki 10*6fbb086dSAndreas Boehlerif(!defined('DOKU_INC')) die(); 11*6fbb086dSAndreas Boehler 12*6fbb086dSAndreas Boehlerif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 13*6fbb086dSAndreas Boehlerrequire_once(DOKU_PLUGIN.'syntax.php'); 14*6fbb086dSAndreas Boehler 15*6fbb086dSAndreas Boehlerclass syntax_plugin_davcal_table extends DokuWiki_Syntax_Plugin { 16*6fbb086dSAndreas Boehler 17*6fbb086dSAndreas Boehler protected $hlp = null; 18*6fbb086dSAndreas Boehler 19*6fbb086dSAndreas Boehler // Load the helper plugin 20*6fbb086dSAndreas Boehler public function syntax_plugin_davcal_table() { 21*6fbb086dSAndreas Boehler $this->hlp =& plugin_load('helper', 'davcal'); 22*6fbb086dSAndreas Boehler } 23*6fbb086dSAndreas Boehler 24*6fbb086dSAndreas Boehler 25*6fbb086dSAndreas Boehler /** 26*6fbb086dSAndreas Boehler * What kind of syntax are we? 27*6fbb086dSAndreas Boehler */ 28*6fbb086dSAndreas Boehler function getType(){ 29*6fbb086dSAndreas Boehler return 'substition'; 30*6fbb086dSAndreas Boehler } 31*6fbb086dSAndreas Boehler 32*6fbb086dSAndreas Boehler /** 33*6fbb086dSAndreas Boehler * What about paragraphs? 34*6fbb086dSAndreas Boehler */ 35*6fbb086dSAndreas Boehler function getPType(){ 36*6fbb086dSAndreas Boehler return 'normal'; 37*6fbb086dSAndreas Boehler } 38*6fbb086dSAndreas Boehler 39*6fbb086dSAndreas Boehler /** 40*6fbb086dSAndreas Boehler * Where to sort in? 41*6fbb086dSAndreas Boehler */ 42*6fbb086dSAndreas Boehler function getSort(){ 43*6fbb086dSAndreas Boehler return 165; 44*6fbb086dSAndreas Boehler } 45*6fbb086dSAndreas Boehler 46*6fbb086dSAndreas Boehler /** 47*6fbb086dSAndreas Boehler * Connect pattern to lexer 48*6fbb086dSAndreas Boehler */ 49*6fbb086dSAndreas Boehler function connectTo($mode) { 50*6fbb086dSAndreas Boehler $this->Lexer->addSpecialPattern('\{\{davcaltable>[^}]*\}\}',$mode,'plugin_davcal_table'); 51*6fbb086dSAndreas Boehler } 52*6fbb086dSAndreas Boehler 53*6fbb086dSAndreas Boehler /** 54*6fbb086dSAndreas Boehler * Handle the match 55*6fbb086dSAndreas Boehler */ 56*6fbb086dSAndreas Boehler function handle($match, $state, $pos, &$handler){ 57*6fbb086dSAndreas Boehler global $ID; 58*6fbb086dSAndreas Boehler $options = trim(substr($match,14,-2)); 59*6fbb086dSAndreas Boehler $options = explode(',', $options); 60*6fbb086dSAndreas Boehler 61*6fbb086dSAndreas Boehler $data = array('id' => array(), 62*6fbb086dSAndreas Boehler 'startdate' => 'today', 63*6fbb086dSAndreas Boehler 'numdays' => 30, 64*6fbb086dSAndreas Boehler 'dateformat' => 'Y-m-d H:i', 65*6fbb086dSAndreas Boehler 'onlystart' => false, 66*6fbb086dSAndreas Boehler 'sort' => 'desc' 67*6fbb086dSAndreas Boehler ); 68*6fbb086dSAndreas Boehler $lastid = $ID; 69*6fbb086dSAndreas Boehler 70*6fbb086dSAndreas Boehler foreach($options as $option) 71*6fbb086dSAndreas Boehler { 72*6fbb086dSAndreas Boehler list($key, $val) = explode('=', $option); 73*6fbb086dSAndreas Boehler $key = strtolower(trim($key)); 74*6fbb086dSAndreas Boehler $val = trim($val); 75*6fbb086dSAndreas Boehler switch($key) 76*6fbb086dSAndreas Boehler { 77*6fbb086dSAndreas Boehler case 'id': 78*6fbb086dSAndreas Boehler $lastid = $val; 79*6fbb086dSAndreas Boehler if(!in_array($val, $data['id'])) 80*6fbb086dSAndreas Boehler $data['id'][$val] = '#3a87ad'; 81*6fbb086dSAndreas Boehler break; 82*6fbb086dSAndreas Boehler case 'onlystart': 83*6fbb086dSAndreas Boehler if(($val === 'on') || ($val === 'true')) 84*6fbb086dSAndreas Boehler $data['onlystart'] = true; 85*6fbb086dSAndreas Boehler break; 86*6fbb086dSAndreas Boehler default: 87*6fbb086dSAndreas Boehler $data[$key] = $val; 88*6fbb086dSAndreas Boehler } 89*6fbb086dSAndreas Boehler } 90*6fbb086dSAndreas Boehler 91*6fbb086dSAndreas Boehler // Handle the default case when the user didn't enter a different ID 92*6fbb086dSAndreas Boehler if(empty($data['id'])) 93*6fbb086dSAndreas Boehler { 94*6fbb086dSAndreas Boehler $data['id'] = array($ID => '#3a87ad'); 95*6fbb086dSAndreas Boehler } 96*6fbb086dSAndreas Boehler 97*6fbb086dSAndreas Boehler return $data; 98*6fbb086dSAndreas Boehler } 99*6fbb086dSAndreas Boehler 100*6fbb086dSAndreas Boehler private static function sort_events_asc($a, $b) 101*6fbb086dSAndreas Boehler { 102*6fbb086dSAndreas Boehler $from1 = new \DateTime($a['start']); 103*6fbb086dSAndreas Boehler $from2 = new \DateTime($b['start']); 104*6fbb086dSAndreas Boehler return $from2 < $from1; 105*6fbb086dSAndreas Boehler } 106*6fbb086dSAndreas Boehler 107*6fbb086dSAndreas Boehler private static function sort_events_desc($a, $b) 108*6fbb086dSAndreas Boehler { 109*6fbb086dSAndreas Boehler $from1 = new \DateTime($a['start']); 110*6fbb086dSAndreas Boehler $from2 = new \DateTime($b['start']); 111*6fbb086dSAndreas Boehler return $from1 < $from2; 112*6fbb086dSAndreas Boehler } 113*6fbb086dSAndreas Boehler 114*6fbb086dSAndreas Boehler /** 115*6fbb086dSAndreas Boehler * Create output 116*6fbb086dSAndreas Boehler */ 117*6fbb086dSAndreas Boehler function render($format, &$R, $data) { 118*6fbb086dSAndreas Boehler if($format == 'metadata') 119*6fbb086dSAndreas Boehler { 120*6fbb086dSAndreas Boehler $R->meta['plugin_davcal']['table'] = true; 121*6fbb086dSAndreas Boehler return true; 122*6fbb086dSAndreas Boehler } 123*6fbb086dSAndreas Boehler if(($format != 'xhtml') && ($format != 'odt')) return false; 124*6fbb086dSAndreas Boehler global $ID; 125*6fbb086dSAndreas Boehler 126*6fbb086dSAndreas Boehler $events = array(); 127*6fbb086dSAndreas Boehler $from = $data['startdate']; 128*6fbb086dSAndreas Boehler if($from === 'today') 129*6fbb086dSAndreas Boehler $from = new \DateTime(); 130*6fbb086dSAndreas Boehler else 131*6fbb086dSAndreas Boehler $from = new \DateTime($from); 132*6fbb086dSAndreas Boehler $to = clone $from; 133*6fbb086dSAndreas Boehler $to->add(new \DateInterval('P'.$data['numdays'].'D')); 134*6fbb086dSAndreas Boehler foreach($data['id'] as $calPage => $color) 135*6fbb086dSAndreas Boehler { 136*6fbb086dSAndreas Boehler $events = array_merge($events, $this->hlp->getEventsWithinDateRange($calPage, 137*6fbb086dSAndreas Boehler $user, $from->format('Y-m-d'), $to->format('Y-m-d'))); 138*6fbb086dSAndreas Boehler } 139*6fbb086dSAndreas Boehler if($data['sort'] === 'desc') 140*6fbb086dSAndreas Boehler usort($events, array("syntax_plugin_davcal_table", "sort_events_desc")); 141*6fbb086dSAndreas Boehler else 142*6fbb086dSAndreas Boehler usort($events, array("syntax_plugin_davcal_table", "sort_events_asc")); 143*6fbb086dSAndreas Boehler 144*6fbb086dSAndreas Boehler $R->table_open(); 145*6fbb086dSAndreas Boehler $R->tablethead_open(); 146*6fbb086dSAndreas Boehler $R->tableheader_open(); 147*6fbb086dSAndreas Boehler $R->doc .= $data['onlystart'] ? $this->getLang('at') : $this->getLang('from'); 148*6fbb086dSAndreas Boehler $R->tableheader_close(); 149*6fbb086dSAndreas Boehler if(!$data['onlystart']) 150*6fbb086dSAndreas Boehler { 151*6fbb086dSAndreas Boehler $R->tableheader_open(); 152*6fbb086dSAndreas Boehler $R->doc .= $this->getLang('to'); 153*6fbb086dSAndreas Boehler $R->tableheader_close(); 154*6fbb086dSAndreas Boehler } 155*6fbb086dSAndreas Boehler $R->tableheader_open(); 156*6fbb086dSAndreas Boehler $R->doc .= $this->getLang('title'); 157*6fbb086dSAndreas Boehler $R->tableheader_close(); 158*6fbb086dSAndreas Boehler $R->tableheader_open(); 159*6fbb086dSAndreas Boehler $R->doc .= $this->getLang('description'); 160*6fbb086dSAndreas Boehler $R->tableheader_close(); 161*6fbb086dSAndreas Boehler $R->tablethead_close(); 162*6fbb086dSAndreas Boehler foreach($events as $event) 163*6fbb086dSAndreas Boehler { 164*6fbb086dSAndreas Boehler $R->tablerow_open(); 165*6fbb086dSAndreas Boehler $R->tablecell_open(); 166*6fbb086dSAndreas Boehler $from = new \DateTime($event['start']); 167*6fbb086dSAndreas Boehler $to = new \DateTime($event['end']); 168*6fbb086dSAndreas Boehler $R->doc .= $from->format($data['dateformat']); 169*6fbb086dSAndreas Boehler $R->tablecell_close(); 170*6fbb086dSAndreas Boehler if(!$data['onlystart']) 171*6fbb086dSAndreas Boehler { 172*6fbb086dSAndreas Boehler $R->tablecell_open(); 173*6fbb086dSAndreas Boehler $R->doc .= $to->format($data['dateformat']); 174*6fbb086dSAndreas Boehler $R->tablecell_close(); 175*6fbb086dSAndreas Boehler } 176*6fbb086dSAndreas Boehler $R->tablecell_open(); 177*6fbb086dSAndreas Boehler $R->doc .= $event['title']; 178*6fbb086dSAndreas Boehler $R->tablecell_close(); 179*6fbb086dSAndreas Boehler $R->tablecell_open(); 180*6fbb086dSAndreas Boehler $R->doc .= $event['description']; 181*6fbb086dSAndreas Boehler $R->tablecell_close(); 182*6fbb086dSAndreas Boehler $R->tablerow_close(); 183*6fbb086dSAndreas Boehler } 184*6fbb086dSAndreas Boehler $R->table_close(); 185*6fbb086dSAndreas Boehler } 186*6fbb086dSAndreas Boehler 187*6fbb086dSAndreas Boehler 188*6fbb086dSAndreas Boehler 189*6fbb086dSAndreas Boehler} 190*6fbb086dSAndreas Boehler 191*6fbb086dSAndreas Boehler// vim:ts=4:sw=4:et:enc=utf-8: 192