xref: /plugin/davcal/syntax/table.php (revision 6fbb086d835723c3ad70de10d11348b94a544f37)
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