xref: /plugin/struct/renderer/csv.php (revision d6d97f6064c3b0f90310be8341edc9585520ee54)
1eafc109fSAndreas Gohr<?php
2eafc109fSAndreas Gohr
3eafc109fSAndreas Gohr/**
4f36cc634SAndreas Gohr * CSV export of tabular data generated in Aggregations
5f36cc634SAndreas Gohr *
6f36cc634SAndreas Gohr * Note: this is different from meta\CSVExporter
7eafc109fSAndreas Gohr *
8b22abfe9SAndreas Gohr * @link https://tools.ietf.org/html/rfc4180
9b22abfe9SAndreas Gohr * @link http://csvlint.io/
10eafc109fSAndreas Gohr */
11*d6d97f60SAnna Dabrowskaclass renderer_plugin_struct_csv extends Doku_Renderer
12*d6d97f60SAnna Dabrowska{
13eafc109fSAndreas Gohr
14eafc109fSAndreas Gohr    protected $first = false;
15eafc109fSAndreas Gohr
16eafc109fSAndreas Gohr    /**
17eafc109fSAndreas Gohr     * Determine if out put is wanted right now
18eafc109fSAndreas Gohr     *
19eafc109fSAndreas Gohr     * @return bool
20eafc109fSAndreas Gohr     */
21*d6d97f60SAnna Dabrowska    function _doOutput()
22*d6d97f60SAnna Dabrowska    {
23eafc109fSAndreas Gohr        global $INPUT;
24eafc109fSAndreas Gohr
25eafc109fSAndreas Gohr        if (
26eafc109fSAndreas Gohr            !isset($this->info['struct_table_hash']) or
27eafc109fSAndreas Gohr            $this->info['struct_table_hash'] != $INPUT->str('hash')
28eafc109fSAndreas Gohr        ) {
29eafc109fSAndreas Gohr            return false;
30eafc109fSAndreas Gohr        }
31eafc109fSAndreas Gohr
32eafc109fSAndreas Gohr        if (!empty($this->info['struct_table_meta'])) {
33eafc109fSAndreas Gohr            return false;
34eafc109fSAndreas Gohr        }
35eafc109fSAndreas Gohr
36eafc109fSAndreas Gohr        return true;
37eafc109fSAndreas Gohr    }
38eafc109fSAndreas Gohr
39eafc109fSAndreas Gohr    /**
40eafc109fSAndreas Gohr     * Our own format
41eafc109fSAndreas Gohr     *
42eafc109fSAndreas Gohr     * @return string
43eafc109fSAndreas Gohr     */
44*d6d97f60SAnna Dabrowska    function getFormat()
45*d6d97f60SAnna Dabrowska    {
46eafc109fSAndreas Gohr        return 'struct_csv';
47eafc109fSAndreas Gohr    }
48eafc109fSAndreas Gohr
49eafc109fSAndreas Gohr    /**
50eafc109fSAndreas Gohr     * Set proper headers
51eafc109fSAndreas Gohr     */
52*d6d97f60SAnna Dabrowska    function document_start()
53*d6d97f60SAnna Dabrowska    {
54eafc109fSAndreas Gohr        global $ID;
55b22abfe9SAndreas Gohr        $filename = noNS($ID) . '.csv';
56eafc109fSAndreas Gohr        $headers = array(
57b22abfe9SAndreas Gohr            'Content-Type' => 'text/csv',
58eafc109fSAndreas Gohr            'Content-Disposition' => 'attachment; filename="' . $filename . '";'
59eafc109fSAndreas Gohr        );
601ba236caSAndreas Gohr        p_set_metadata($ID, array('format' => array('struct_csv' => $headers)));
61eafc109fSAndreas Gohr        // don't cache
62eafc109fSAndreas Gohr        $this->nocache();
63eafc109fSAndreas Gohr    }
64eafc109fSAndreas Gohr
65eafc109fSAndreas Gohr    /**
66eafc109fSAndreas Gohr     * Opening a table row prevents the separator for the first following cell
67eafc109fSAndreas Gohr     */
68*d6d97f60SAnna Dabrowska    function tablerow_open()
69*d6d97f60SAnna Dabrowska    {
70eafc109fSAndreas Gohr        if (!$this->_doOutput()) return;
71eafc109fSAndreas Gohr        $this->first = true;
72eafc109fSAndreas Gohr    }
73eafc109fSAndreas Gohr
74eafc109fSAndreas Gohr    /**
75b22abfe9SAndreas Gohr     * Output the delimiter (unless it's the first cell of this row) and the text wrapper
76eafc109fSAndreas Gohr     *
77eafc109fSAndreas Gohr     * @param int $colspan ignored
78eafc109fSAndreas Gohr     * @param null $align ignored
79eafc109fSAndreas Gohr     * @param int $rowspan ignored
80eafc109fSAndreas Gohr     */
81*d6d97f60SAnna Dabrowska    function tablecell_open($colspan = 1, $align = null, $rowspan = 1)
82*d6d97f60SAnna Dabrowska    {
83eafc109fSAndreas Gohr        if (!$this->_doOutput()) return;
84eafc109fSAndreas Gohr        if (!$this->first) {
85b22abfe9SAndreas Gohr            $this->doc .= ",";
86eafc109fSAndreas Gohr        }
87eafc109fSAndreas Gohr        $this->first = false;
88b22abfe9SAndreas Gohr
89b22abfe9SAndreas Gohr        $this->doc .= '"';
90b22abfe9SAndreas Gohr    }
91b22abfe9SAndreas Gohr
92b22abfe9SAndreas Gohr    /**
93b22abfe9SAndreas Gohr     * Close the text wrapper
94b22abfe9SAndreas Gohr     */
95*d6d97f60SAnna Dabrowska    function tablecell_close()
96*d6d97f60SAnna Dabrowska    {
973889beb2SAndreas Gohr        if (!$this->_doOutput()) return;
98b22abfe9SAndreas Gohr        $this->doc .= '"';
99eafc109fSAndreas Gohr    }
100eafc109fSAndreas Gohr
101eafc109fSAndreas Gohr    /**
102eafc109fSAndreas Gohr     * Alias for tablecell_open
103eafc109fSAndreas Gohr     *
104eafc109fSAndreas Gohr     * @param int $colspan ignored
105eafc109fSAndreas Gohr     * @param null $align ignored
106eafc109fSAndreas Gohr     * @param int $rowspan ignored
107eafc109fSAndreas Gohr     */
108*d6d97f60SAnna Dabrowska    function tableheader_open($colspan = 1, $align = null, $rowspan = 1)
109*d6d97f60SAnna Dabrowska    {
110eafc109fSAndreas Gohr        $this->tablecell_open($colspan, $align, $rowspan);
111eafc109fSAndreas Gohr    }
112eafc109fSAndreas Gohr
113eafc109fSAndreas Gohr    /**
114b22abfe9SAndreas Gohr     * Alias for tablecell_close
115b22abfe9SAndreas Gohr     */
116*d6d97f60SAnna Dabrowska    function tableheader_close()
117*d6d97f60SAnna Dabrowska    {
118b22abfe9SAndreas Gohr        $this->tablecell_close();
119b22abfe9SAndreas Gohr    }
120b22abfe9SAndreas Gohr
121b22abfe9SAndreas Gohr    /**
122b22abfe9SAndreas Gohr     * Add CRLF newline at the end of one line
123eafc109fSAndreas Gohr     */
124*d6d97f60SAnna Dabrowska    function tablerow_close()
125*d6d97f60SAnna Dabrowska    {
126eafc109fSAndreas Gohr        if (!$this->_doOutput()) return;
127b22abfe9SAndreas Gohr        $this->doc .= "\r\n";
128eafc109fSAndreas Gohr    }
129eafc109fSAndreas Gohr
130eafc109fSAndreas Gohr    /**
131eafc109fSAndreas Gohr     * Outputs cell content
132eafc109fSAndreas Gohr     *
133eafc109fSAndreas Gohr     * @param string $text
134eafc109fSAndreas Gohr     */
135*d6d97f60SAnna Dabrowska    function cdata($text)
136*d6d97f60SAnna Dabrowska    {
137eafc109fSAndreas Gohr        if (!$this->_doOutput()) return;
138b22abfe9SAndreas Gohr        if ($text === '') return;
139b22abfe9SAndreas Gohr
140b22abfe9SAndreas Gohr        $this->doc .= str_replace('"', '""', $text);
141eafc109fSAndreas Gohr    }
142eafc109fSAndreas Gohr
143ba55430dSAndreas Gohr
144ba55430dSAndreas Gohr    #region overrides using cdata for output
145ba55430dSAndreas Gohr
146*d6d97f60SAnna Dabrowska    function internallink($link, $title = null)
147*d6d97f60SAnna Dabrowska    {
148ba55430dSAndreas Gohr        if (is_null($title) or is_array($title) or $title == '') {
149ba55430dSAndreas Gohr            $title = $this->_simpleTitle($link);
150ba55430dSAndreas Gohr        }
151eafc109fSAndreas Gohr        $this->cdata($title);
152eafc109fSAndreas Gohr    }
153eafc109fSAndreas Gohr
154*d6d97f60SAnna Dabrowska    function externallink($link, $title = null)
155*d6d97f60SAnna Dabrowska    {
156ba55430dSAndreas Gohr        if (is_null($title) or is_array($title) or $title == '') {
157ba55430dSAndreas Gohr            $title = $link;
158ba55430dSAndreas Gohr        }
159ba55430dSAndreas Gohr        $this->cdata($title);
160ba55430dSAndreas Gohr    }
161ba55430dSAndreas Gohr
162*d6d97f60SAnna Dabrowska    function emaillink($address, $name = null)
163*d6d97f60SAnna Dabrowska    {
16449fe301bSAndreas Gohr        $this->cdata($address);
16549fe301bSAndreas Gohr    }
166ba55430dSAndreas Gohr
167*d6d97f60SAnna Dabrowska    function plugin($name, $args, $state = '', $match = '')
168*d6d97f60SAnna Dabrowska    {
169470e44beSAndreas Gohr        if (substr($name, 0, 7) == 'struct_') {
170470e44beSAndreas Gohr            parent::plugin($name, $args, $state, $match);
171470e44beSAndreas Gohr        } else {
172ba55430dSAndreas Gohr            $this->cdata($match);
173ba55430dSAndreas Gohr        }
174470e44beSAndreas Gohr    }
175ba55430dSAndreas Gohr
176*d6d97f60SAnna Dabrowska    function acronym($acronym)
177*d6d97f60SAnna Dabrowska    {
178ba55430dSAndreas Gohr        $this->cdata($acronym);
179ba55430dSAndreas Gohr    }
180ba55430dSAndreas Gohr
181*d6d97f60SAnna Dabrowska    function code($text, $lang = null, $file = null)
182*d6d97f60SAnna Dabrowska    {
183ba55430dSAndreas Gohr        $this->cdata($text);
184ba55430dSAndreas Gohr    }
185ba55430dSAndreas Gohr
186*d6d97f60SAnna Dabrowska    function header($text, $level, $pos)
187*d6d97f60SAnna Dabrowska    {
188ba55430dSAndreas Gohr        $this->cdata($text);
189ba55430dSAndreas Gohr    }
190ba55430dSAndreas Gohr
191*d6d97f60SAnna Dabrowska    function linebreak()
192*d6d97f60SAnna Dabrowska    {
193ba55430dSAndreas Gohr        $this->cdata("\r\n");
194ba55430dSAndreas Gohr    }
195ba55430dSAndreas Gohr
196*d6d97f60SAnna Dabrowska    function unformatted($text)
197*d6d97f60SAnna Dabrowska    {
198ba55430dSAndreas Gohr        $this->cdata($text);
199ba55430dSAndreas Gohr    }
200ba55430dSAndreas Gohr
201*d6d97f60SAnna Dabrowska    function php($text)
202*d6d97f60SAnna Dabrowska    {
203ba55430dSAndreas Gohr        $this->cdata($text);
204ba55430dSAndreas Gohr    }
205ba55430dSAndreas Gohr
206*d6d97f60SAnna Dabrowska    function phpblock($text)
207*d6d97f60SAnna Dabrowska    {
208ba55430dSAndreas Gohr        $this->cdata($text);
209ba55430dSAndreas Gohr    }
210ba55430dSAndreas Gohr
211*d6d97f60SAnna Dabrowska    function html($text)
212*d6d97f60SAnna Dabrowska    {
213ba55430dSAndreas Gohr        $this->cdata($text);
214ba55430dSAndreas Gohr    }
215ba55430dSAndreas Gohr
216*d6d97f60SAnna Dabrowska    function htmlblock($text)
217*d6d97f60SAnna Dabrowska    {
218ba55430dSAndreas Gohr        $this->cdata($text);
219ba55430dSAndreas Gohr    }
220ba55430dSAndreas Gohr
221*d6d97f60SAnna Dabrowska    function preformatted($text)
222*d6d97f60SAnna Dabrowska    {
223ba55430dSAndreas Gohr        $this->cdata($text);
224ba55430dSAndreas Gohr    }
225ba55430dSAndreas Gohr
226*d6d97f60SAnna Dabrowska    function file($text, $lang = null, $file = null)
227*d6d97f60SAnna Dabrowska    {
228ba55430dSAndreas Gohr        $this->cdata($text);
229ba55430dSAndreas Gohr    }
230ba55430dSAndreas Gohr
231*d6d97f60SAnna Dabrowska    function smiley($smiley)
232*d6d97f60SAnna Dabrowska    {
233ba55430dSAndreas Gohr        $this->cdata($smiley);
234ba55430dSAndreas Gohr    }
235ba55430dSAndreas Gohr
236*d6d97f60SAnna Dabrowska    function entity($entity)
237*d6d97f60SAnna Dabrowska    {
238ba55430dSAndreas Gohr        $this->cdata($entity);
239ba55430dSAndreas Gohr    }
240ba55430dSAndreas Gohr
241*d6d97f60SAnna Dabrowska    function multiplyentity($x, $y)
242*d6d97f60SAnna Dabrowska    {
243ba55430dSAndreas Gohr        $this->cdata($x . 'x' . $y);
244ba55430dSAndreas Gohr    }
245ba55430dSAndreas Gohr
246*d6d97f60SAnna Dabrowska    function locallink($hash, $name = null)
247*d6d97f60SAnna Dabrowska    {
248ba55430dSAndreas Gohr        if (is_null($name) or is_array($name) or $name == '') {
249ba55430dSAndreas Gohr            $name = $hash;
250ba55430dSAndreas Gohr        }
251ba55430dSAndreas Gohr        $this->cdata($name);
252ba55430dSAndreas Gohr    }
253ba55430dSAndreas Gohr
254*d6d97f60SAnna Dabrowska    function interwikilink($link, $title = null, $wikiName, $wikiUri)
255*d6d97f60SAnna Dabrowska    {
256ba55430dSAndreas Gohr        if (is_null($title) or is_array($title) or $title == '') {
257ba55430dSAndreas Gohr            $title = $wikiName . '>' . $link;
258ba55430dSAndreas Gohr        }
259ba55430dSAndreas Gohr        $this->cdata($title);
260ba55430dSAndreas Gohr    }
261ba55430dSAndreas Gohr
262*d6d97f60SAnna Dabrowska    function filelink($link, $title = null)
263*d6d97f60SAnna Dabrowska    {
264ba55430dSAndreas Gohr        if (is_null($title) or is_array($title) or $title == '') {
265ba55430dSAndreas Gohr            $title = $link;
266ba55430dSAndreas Gohr        }
267ba55430dSAndreas Gohr        $this->cdata($title);
268ba55430dSAndreas Gohr    }
269ba55430dSAndreas Gohr
270*d6d97f60SAnna Dabrowska    function windowssharelink($link, $title = null)
271*d6d97f60SAnna Dabrowska    {
272ba55430dSAndreas Gohr        if (is_null($title) or is_array($title) or $title == '') {
273ba55430dSAndreas Gohr            $title = $link;
274ba55430dSAndreas Gohr        }
275ba55430dSAndreas Gohr        $this->cdata($title);
276ba55430dSAndreas Gohr    }
277ba55430dSAndreas Gohr
278*d6d97f60SAnna Dabrowska    function internalmedia(
279*d6d97f60SAnna Dabrowska        $src,
280*d6d97f60SAnna Dabrowska        $title = null,
281*d6d97f60SAnna Dabrowska        $align = null,
282*d6d97f60SAnna Dabrowska        $width = null,
283*d6d97f60SAnna Dabrowska        $height = null,
284*d6d97f60SAnna Dabrowska        $cache = null,
285*d6d97f60SAnna Dabrowska        $linking = null
286*d6d97f60SAnna Dabrowska    ) {
287ba55430dSAndreas Gohr        $this->cdata($src);
288ba55430dSAndreas Gohr    }
289ba55430dSAndreas Gohr
290*d6d97f60SAnna Dabrowska    function externalmedia(
291*d6d97f60SAnna Dabrowska        $src,
292*d6d97f60SAnna Dabrowska        $title = null,
293*d6d97f60SAnna Dabrowska        $align = null,
294*d6d97f60SAnna Dabrowska        $width = null,
295*d6d97f60SAnna Dabrowska        $height = null,
296*d6d97f60SAnna Dabrowska        $cache = null,
297*d6d97f60SAnna Dabrowska        $linking = null
298*d6d97f60SAnna Dabrowska    ) {
299ba55430dSAndreas Gohr        $this->cdata($src);
300ba55430dSAndreas Gohr    }
301ba55430dSAndreas Gohr
302*d6d97f60SAnna Dabrowska    function internalmedialink(
303*d6d97f60SAnna Dabrowska        $src,
304*d6d97f60SAnna Dabrowska        $title = null,
305*d6d97f60SAnna Dabrowska        $align = null,
306*d6d97f60SAnna Dabrowska        $width = null,
307*d6d97f60SAnna Dabrowska        $height = null,
308*d6d97f60SAnna Dabrowska        $cache = null
309*d6d97f60SAnna Dabrowska    ) {
310ba55430dSAndreas Gohr        $this->cdata($src);
311ba55430dSAndreas Gohr    }
312ba55430dSAndreas Gohr
313*d6d97f60SAnna Dabrowska    function externalmedialink(
314*d6d97f60SAnna Dabrowska        $src,
315*d6d97f60SAnna Dabrowska        $title = null,
316*d6d97f60SAnna Dabrowska        $align = null,
317*d6d97f60SAnna Dabrowska        $width = null,
318*d6d97f60SAnna Dabrowska        $height = null,
319*d6d97f60SAnna Dabrowska        $cache = null
320*d6d97f60SAnna Dabrowska    ) {
321ba55430dSAndreas Gohr        $this->cdata($src);
322ba55430dSAndreas Gohr    }
323ba55430dSAndreas Gohr
324ba55430dSAndreas Gohr    #endregion
325eafc109fSAndreas Gohr}
326