1 <?php
2 /**
3  * Plugin iCalEvents: Renders an iCalendar file, e.g., as a table.
4  *
5  * Copyright (C) 2010-2012, 2015-2016
6  * Tim Ruffing, Robert Rackl, Elan Ruusamäe, Jannes Drost-Tenfelde
7  *
8  * This file is part of the DokuWiki iCalEvents plugin.
9  *
10  * The DokuWiki iCalEvents plugin program is free software:
11  * you can redistribute it and/or modify it under the terms of the
12  * GNU General Public License version 2 as published by the Free
13  * Software Foundation.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * version 2 along with the DokuWiki iCalEvents plugin program.  If
22  * not, see <http://www.gnu.org/licenses/gpl-2.0.html>.
23  *
24  * @license    https://www.gnu.org/licenses/gpl-2.0.html GPL2
25  * @author     Tim Ruffing <tim@timruffing.de>
26  * @author     Robert Rackl <wiki@doogie.de>
27  * @author     Elan Ruusamäe <glen@delfi.ee>
28  * @author     Jannes Drost-Tenfelde <info@drost-tenfelde.de>
29  *
30  */
31 
32 // We require at least PHP 5.5.
33 if (PHP_VERSION_ID < 50500)
34     return;
35 
36 
37 // must be run within Dokuwiki
38 if (!defined('DOKU_INC'))
39     die();
40 
41 require_once DOKU_INC . 'inc/parser/renderer.php';
42 require_once __DIR__ . '/vendor/autoload.php';
43 
44 // This is a minimal renderer plugin. It ignores everything except
45 // invocations of our syntax plugin component. These invocations are
46 // handled to output VEVENTs.
47 
48 class renderer_plugin_icalevents extends Doku_Renderer {
49     public $info = array(
50         // no caching, because the cache does not honor the UID parameter
51         'cache' => false,
52         // no table of contents
53         'toc'   => false
54     );
55 
56     private $eventId = false;
57 
58     function getFormat() {
59         return 'icalevents';
60     }
61 
62     function plugin($name, $data, $state = '', $match = '') {
63         // Filter syntax plugins that are not our own syntax plugin,
64         // and stop processing if we have exported an event already.
65         // This is necessary to avoid duplicate VEVENTs in the output,
66         // which arise when displaying the same calendar multiple times on the same page.
67         if ($name == 'icalevents' && $this->eventId === false) {
68             return parent::plugin($name, $data, $state, $match);
69         }
70     }
71 
72     function document_start() {
73         $this->doc = "BEGIN:VCALENDAR\r\n";
74         $this->doc .= "PRODID: -//DokuWiki//NONSGML Plugin iCalEvents//EN" . "\r\n";
75         $this->doc .= "VERSION:2.0\r\n";
76     }
77 
78     function document_end() {
79         global $ID;
80 
81         if ($this->eventId === false) {
82             http_status(404);
83             echo "Error: UID not found";
84             exit;
85         }
86 
87         $filename =  SafeFN::encode(strtr($this->eventId, '/:', '--')) . '.ics';
88         $headers = array(
89             'Content-Type' => 'text/calendar',
90             'Content-Disposition' => 'attachment; filename=' . $filename
91         );
92         p_set_metadata($ID, array('format' => array('icalevents' => $headers)));
93 
94         $this->doc .= "END:VCALENDAR\r\n";
95     }
96 
97     function setEventId($eventId) {
98         $this->eventId = $eventId;
99     }
100 
101     function reset() {
102         $this->eventId = false;
103     }
104 
105     // Instantiating the class several times is not necessary,
106     // because we have implemented reset();
107     function isSingleton() {
108         return true;
109     }
110 }
111 
112