xref: /plugin/struct/renderer/csv.php (revision 7fe2cdf28c472c686961bf42f0123eb33d2f3e60)
1eafc109fSAndreas Gohr<?php
2eafc109fSAndreas Gohr
317a3a578SAndreas Gohr// phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
417a3a578SAndreas Gohr
5eafc109fSAndreas Gohr/**
6f36cc634SAndreas Gohr * CSV export of tabular data generated in Aggregations
7f36cc634SAndreas Gohr *
8f36cc634SAndreas Gohr * Note: this is different from meta\CSVExporter
9eafc109fSAndreas Gohr *
10b22abfe9SAndreas Gohr * @link https://tools.ietf.org/html/rfc4180
11b22abfe9SAndreas Gohr * @link http://csvlint.io/
12eafc109fSAndreas Gohr */
13d6d97f60SAnna Dabrowskaclass renderer_plugin_struct_csv extends Doku_Renderer
14d6d97f60SAnna Dabrowska{
15eafc109fSAndreas Gohr    protected $first = false;
16eafc109fSAndreas Gohr
17eafc109fSAndreas Gohr    /**
18eafc109fSAndreas Gohr     * Determine if out put is wanted right now
19eafc109fSAndreas Gohr     *
20eafc109fSAndreas Gohr     * @return bool
21eafc109fSAndreas Gohr     */
22748e747fSAnna Dabrowska    protected function doOutput()
23d6d97f60SAnna Dabrowska    {
24eafc109fSAndreas Gohr        global $INPUT;
25eafc109fSAndreas Gohr
26eafc109fSAndreas Gohr        if (
27*7fe2cdf2SAndreas Gohr            !isset($this->info['struct_table_hash']) ||
28*7fe2cdf2SAndreas Gohr            $this->info['struct_table_hash'] != $INPUT->str('hash')
29eafc109fSAndreas Gohr        ) {
30eafc109fSAndreas Gohr            return false;
31eafc109fSAndreas Gohr        }
32eafc109fSAndreas Gohr
33eafc109fSAndreas Gohr        if (!empty($this->info['struct_table_meta'])) {
34eafc109fSAndreas Gohr            return false;
35eafc109fSAndreas Gohr        }
36eafc109fSAndreas Gohr
37eafc109fSAndreas Gohr        return true;
38eafc109fSAndreas Gohr    }
39eafc109fSAndreas Gohr
40eafc109fSAndreas Gohr    /**
41eafc109fSAndreas Gohr     * Our own format
42eafc109fSAndreas Gohr     *
43eafc109fSAndreas Gohr     * @return string
44eafc109fSAndreas Gohr     */
45748e747fSAnna Dabrowska    public function getFormat()
46d6d97f60SAnna Dabrowska    {
47eafc109fSAndreas Gohr        return 'struct_csv';
48eafc109fSAndreas Gohr    }
49eafc109fSAndreas Gohr
50eafc109fSAndreas Gohr    /**
51eafc109fSAndreas Gohr     * Set proper headers
52eafc109fSAndreas Gohr     */
5317a3a578SAndreas Gohr    public function document_start()
54d6d97f60SAnna Dabrowska    {
55eafc109fSAndreas Gohr        global $ID;
56*7fe2cdf2SAndreas Gohr        $filename = noNS($ID ?? 'data') . '.csv';
57*7fe2cdf2SAndreas Gohr        $headers = [
58*7fe2cdf2SAndreas Gohr            'Content-Type' => 'text/csv',
59*7fe2cdf2SAndreas Gohr            'Content-Disposition' => 'attachment; filename="' . $filename . '";'
60*7fe2cdf2SAndreas Gohr        ];
617234bfb1Ssplitbrain        p_set_metadata($ID, ['format' => ['struct_csv' => $headers]]);
62eafc109fSAndreas Gohr        // don't cache
63eafc109fSAndreas Gohr        $this->nocache();
64eafc109fSAndreas Gohr    }
65eafc109fSAndreas Gohr
66eafc109fSAndreas Gohr    /**
67eafc109fSAndreas Gohr     * Opening a table row prevents the separator for the first following cell
68eafc109fSAndreas Gohr     */
6917a3a578SAndreas Gohr    public function tablerow_open()
70d6d97f60SAnna Dabrowska    {
71748e747fSAnna Dabrowska        if (!$this->doOutput()) return;
72eafc109fSAndreas Gohr        $this->first = true;
73eafc109fSAndreas Gohr    }
74eafc109fSAndreas Gohr
75eafc109fSAndreas Gohr    /**
76b22abfe9SAndreas Gohr     * Output the delimiter (unless it's the first cell of this row) and the text wrapper
77eafc109fSAndreas Gohr     *
78eafc109fSAndreas Gohr     * @param int $colspan ignored
79eafc109fSAndreas Gohr     * @param null $align ignored
80eafc109fSAndreas Gohr     * @param int $rowspan ignored
8117a3a578SAndreas Gohr     *
82eafc109fSAndreas Gohr     */
8317a3a578SAndreas Gohr    public function tablecell_open($colspan = 1, $align = null, $rowspan = 1)
84d6d97f60SAnna Dabrowska    {
85748e747fSAnna Dabrowska        if (!$this->doOutput()) return;
86eafc109fSAndreas Gohr        if (!$this->first) {
87b22abfe9SAndreas Gohr            $this->doc .= ",";
88eafc109fSAndreas Gohr        }
89eafc109fSAndreas Gohr        $this->first = false;
90b22abfe9SAndreas Gohr
91b22abfe9SAndreas Gohr        $this->doc .= '"';
92b22abfe9SAndreas Gohr    }
93b22abfe9SAndreas Gohr
94b22abfe9SAndreas Gohr    /**
95b22abfe9SAndreas Gohr     * Close the text wrapper
96b22abfe9SAndreas Gohr     */
9717a3a578SAndreas Gohr    public function tablecell_close()
98d6d97f60SAnna Dabrowska    {
99748e747fSAnna Dabrowska        if (!$this->doOutput()) return;
100b22abfe9SAndreas Gohr        $this->doc .= '"';
101eafc109fSAndreas Gohr    }
102eafc109fSAndreas Gohr
103eafc109fSAndreas Gohr    /**
104eafc109fSAndreas Gohr     * Alias for tablecell_open
105eafc109fSAndreas Gohr     *
106eafc109fSAndreas Gohr     * @param int $colspan ignored
107eafc109fSAndreas Gohr     * @param null $align ignored
108eafc109fSAndreas Gohr     * @param int $rowspan ignored
109eafc109fSAndreas Gohr     */
11017a3a578SAndreas Gohr    public function tableheader_open($colspan = 1, $align = null, $rowspan = 1)
111d6d97f60SAnna Dabrowska    {
112eafc109fSAndreas Gohr        $this->tablecell_open($colspan, $align, $rowspan);
113eafc109fSAndreas Gohr    }
114eafc109fSAndreas Gohr
115eafc109fSAndreas Gohr    /**
116b22abfe9SAndreas Gohr     * Alias for tablecell_close
117b22abfe9SAndreas Gohr     */
11817a3a578SAndreas Gohr    public function tableheader_close()
119d6d97f60SAnna Dabrowska    {
120b22abfe9SAndreas Gohr        $this->tablecell_close();
121b22abfe9SAndreas Gohr    }
122b22abfe9SAndreas Gohr
123b22abfe9SAndreas Gohr    /**
124b22abfe9SAndreas Gohr     * Add CRLF newline at the end of one line
125eafc109fSAndreas Gohr     */
12617a3a578SAndreas Gohr    public function tablerow_close()
127d6d97f60SAnna Dabrowska    {
128748e747fSAnna Dabrowska        if (!$this->doOutput()) return;
129b22abfe9SAndreas Gohr        $this->doc .= "\r\n";
130eafc109fSAndreas Gohr    }
131eafc109fSAndreas Gohr
132eafc109fSAndreas Gohr    /**
133eafc109fSAndreas Gohr     * Outputs cell content
134eafc109fSAndreas Gohr     *
135eafc109fSAndreas Gohr     * @param string $text
136eafc109fSAndreas Gohr     */
137748e747fSAnna Dabrowska    public function cdata($text)
138d6d97f60SAnna Dabrowska    {
139748e747fSAnna Dabrowska        if (!$this->doOutput()) return;
140b22abfe9SAndreas Gohr        if ($text === '') return;
141b22abfe9SAndreas Gohr
142b22abfe9SAndreas Gohr        $this->doc .= str_replace('"', '""', $text);
143eafc109fSAndreas Gohr    }
144eafc109fSAndreas Gohr
145ba55430dSAndreas Gohr
146ba55430dSAndreas Gohr    #region overrides using cdata for output
147ba55430dSAndreas Gohr
148748e747fSAnna Dabrowska    public function internallink($link, $title = null)
149d6d97f60SAnna Dabrowska    {
1507234bfb1Ssplitbrain        if (is_null($title) || is_array($title) || $title == '') {
151ba55430dSAndreas Gohr            $title = $this->_simpleTitle($link);
152ba55430dSAndreas Gohr        }
153eafc109fSAndreas Gohr        $this->cdata($title);
154eafc109fSAndreas Gohr    }
155eafc109fSAndreas Gohr
156748e747fSAnna Dabrowska    public function externallink($link, $title = null)
157d6d97f60SAnna Dabrowska    {
1587234bfb1Ssplitbrain        if (is_null($title) || is_array($title) || $title == '') {
159ba55430dSAndreas Gohr            $title = $link;
160ba55430dSAndreas Gohr        }
161ba55430dSAndreas Gohr        $this->cdata($title);
162ba55430dSAndreas Gohr    }
163ba55430dSAndreas Gohr
164748e747fSAnna Dabrowska    public function emaillink($address, $name = null)
165d6d97f60SAnna Dabrowska    {
16649fe301bSAndreas Gohr        $this->cdata($address);
16749fe301bSAndreas Gohr    }
168ba55430dSAndreas Gohr
169748e747fSAnna Dabrowska    public function plugin($name, $args, $state = '', $match = '')
170d6d97f60SAnna Dabrowska    {
171470e44beSAndreas Gohr        if (substr($name, 0, 7) == 'struct_') {
172470e44beSAndreas Gohr            parent::plugin($name, $args, $state, $match);
173470e44beSAndreas Gohr        } else {
174ba55430dSAndreas Gohr            $this->cdata($match);
175ba55430dSAndreas Gohr        }
176470e44beSAndreas Gohr    }
177ba55430dSAndreas Gohr
178748e747fSAnna Dabrowska    public function acronym($acronym)
179d6d97f60SAnna Dabrowska    {
180ba55430dSAndreas Gohr        $this->cdata($acronym);
181ba55430dSAndreas Gohr    }
182ba55430dSAndreas Gohr
183748e747fSAnna Dabrowska    public function code($text, $lang = null, $file = null)
184d6d97f60SAnna Dabrowska    {
185ba55430dSAndreas Gohr        $this->cdata($text);
186ba55430dSAndreas Gohr    }
187ba55430dSAndreas Gohr
188748e747fSAnna Dabrowska    public function header($text, $level, $pos)
189d6d97f60SAnna Dabrowska    {
190ba55430dSAndreas Gohr        $this->cdata($text);
191ba55430dSAndreas Gohr    }
192ba55430dSAndreas Gohr
193748e747fSAnna Dabrowska    public function linebreak()
194d6d97f60SAnna Dabrowska    {
195ba55430dSAndreas Gohr        $this->cdata("\r\n");
196ba55430dSAndreas Gohr    }
197ba55430dSAndreas Gohr
198748e747fSAnna Dabrowska    public function unformatted($text)
199d6d97f60SAnna Dabrowska    {
200ba55430dSAndreas Gohr        $this->cdata($text);
201ba55430dSAndreas Gohr    }
202ba55430dSAndreas Gohr
203748e747fSAnna Dabrowska    public function php($text)
204d6d97f60SAnna Dabrowska    {
205ba55430dSAndreas Gohr        $this->cdata($text);
206ba55430dSAndreas Gohr    }
207ba55430dSAndreas Gohr
208748e747fSAnna Dabrowska    public function phpblock($text)
209d6d97f60SAnna Dabrowska    {
210ba55430dSAndreas Gohr        $this->cdata($text);
211ba55430dSAndreas Gohr    }
212ba55430dSAndreas Gohr
213748e747fSAnna Dabrowska    public function html($text)
214d6d97f60SAnna Dabrowska    {
215ba55430dSAndreas Gohr        $this->cdata($text);
216ba55430dSAndreas Gohr    }
217ba55430dSAndreas Gohr
218748e747fSAnna Dabrowska    public function htmlblock($text)
219d6d97f60SAnna Dabrowska    {
220ba55430dSAndreas Gohr        $this->cdata($text);
221ba55430dSAndreas Gohr    }
222ba55430dSAndreas Gohr
223748e747fSAnna Dabrowska    public function preformatted($text)
224d6d97f60SAnna Dabrowska    {
225ba55430dSAndreas Gohr        $this->cdata($text);
226ba55430dSAndreas Gohr    }
227ba55430dSAndreas Gohr
228748e747fSAnna Dabrowska    public function file($text, $lang = null, $file = null)
229d6d97f60SAnna Dabrowska    {
230ba55430dSAndreas Gohr        $this->cdata($text);
231ba55430dSAndreas Gohr    }
232ba55430dSAndreas Gohr
233748e747fSAnna Dabrowska    public function smiley($smiley)
234d6d97f60SAnna Dabrowska    {
235ba55430dSAndreas Gohr        $this->cdata($smiley);
236ba55430dSAndreas Gohr    }
237ba55430dSAndreas Gohr
238748e747fSAnna Dabrowska    public function entity($entity)
239d6d97f60SAnna Dabrowska    {
240ba55430dSAndreas Gohr        $this->cdata($entity);
241ba55430dSAndreas Gohr    }
242ba55430dSAndreas Gohr
243748e747fSAnna Dabrowska    public function multiplyentity($x, $y)
244d6d97f60SAnna Dabrowska    {
245ba55430dSAndreas Gohr        $this->cdata($x . 'x' . $y);
246ba55430dSAndreas Gohr    }
247ba55430dSAndreas Gohr
248748e747fSAnna Dabrowska    public function locallink($hash, $name = null)
249d6d97f60SAnna Dabrowska    {
2507234bfb1Ssplitbrain        if (is_null($name) || is_array($name) || $name == '') {
251ba55430dSAndreas Gohr            $name = $hash;
252ba55430dSAndreas Gohr        }
253ba55430dSAndreas Gohr        $this->cdata($name);
254ba55430dSAndreas Gohr    }
255ba55430dSAndreas Gohr
256748e747fSAnna Dabrowska    public function interwikilink($link, $title, $wikiName, $wikiUri)
257d6d97f60SAnna Dabrowska    {
2587234bfb1Ssplitbrain        if (is_array($title) || $title == '') {
259ba55430dSAndreas Gohr            $title = $wikiName . '>' . $link;
260ba55430dSAndreas Gohr        }
261ba55430dSAndreas Gohr        $this->cdata($title);
262ba55430dSAndreas Gohr    }
263ba55430dSAndreas Gohr
264748e747fSAnna Dabrowska    public function filelink($link, $title = null)
265d6d97f60SAnna Dabrowska    {
2667234bfb1Ssplitbrain        if (is_null($title) || is_array($title) || $title == '') {
267ba55430dSAndreas Gohr            $title = $link;
268ba55430dSAndreas Gohr        }
269ba55430dSAndreas Gohr        $this->cdata($title);
270ba55430dSAndreas Gohr    }
271ba55430dSAndreas Gohr
272748e747fSAnna Dabrowska    public function windowssharelink($link, $title = null)
273d6d97f60SAnna Dabrowska    {
2747234bfb1Ssplitbrain        if (is_null($title) || is_array($title) || $title == '') {
275ba55430dSAndreas Gohr            $title = $link;
276ba55430dSAndreas Gohr        }
277ba55430dSAndreas Gohr        $this->cdata($title);
278ba55430dSAndreas Gohr    }
279ba55430dSAndreas Gohr
280748e747fSAnna Dabrowska    public function internalmedia(
281d6d97f60SAnna Dabrowska        $src,
282d6d97f60SAnna Dabrowska        $title = null,
283d6d97f60SAnna Dabrowska        $align = null,
284d6d97f60SAnna Dabrowska        $width = null,
285d6d97f60SAnna Dabrowska        $height = null,
286d6d97f60SAnna Dabrowska        $cache = null,
287d6d97f60SAnna Dabrowska        $linking = null
288d6d97f60SAnna Dabrowska    ) {
289ba55430dSAndreas Gohr        $this->cdata($src);
290ba55430dSAndreas Gohr    }
291ba55430dSAndreas Gohr
292748e747fSAnna Dabrowska    public function externalmedia(
293d6d97f60SAnna Dabrowska        $src,
294d6d97f60SAnna Dabrowska        $title = null,
295d6d97f60SAnna Dabrowska        $align = null,
296d6d97f60SAnna Dabrowska        $width = null,
297d6d97f60SAnna Dabrowska        $height = null,
298d6d97f60SAnna Dabrowska        $cache = null,
299d6d97f60SAnna Dabrowska        $linking = null
300d6d97f60SAnna Dabrowska    ) {
301ba55430dSAndreas Gohr        $this->cdata($src);
302ba55430dSAndreas Gohr    }
303ba55430dSAndreas Gohr
304748e747fSAnna Dabrowska    public function internalmedialink(
305d6d97f60SAnna Dabrowska        $src,
306d6d97f60SAnna Dabrowska        $title = null,
307d6d97f60SAnna Dabrowska        $align = null,
308d6d97f60SAnna Dabrowska        $width = null,
309d6d97f60SAnna Dabrowska        $height = null,
310d6d97f60SAnna Dabrowska        $cache = null
311d6d97f60SAnna Dabrowska    ) {
312ba55430dSAndreas Gohr        $this->cdata($src);
313ba55430dSAndreas Gohr    }
314ba55430dSAndreas Gohr
315748e747fSAnna Dabrowska    public function externalmedialink(
316d6d97f60SAnna Dabrowska        $src,
317d6d97f60SAnna Dabrowska        $title = null,
318d6d97f60SAnna Dabrowska        $align = null,
319d6d97f60SAnna Dabrowska        $width = null,
320d6d97f60SAnna Dabrowska        $height = null,
321d6d97f60SAnna Dabrowska        $cache = null
322d6d97f60SAnna Dabrowska    ) {
323ba55430dSAndreas Gohr        $this->cdata($src);
324ba55430dSAndreas Gohr    }
325ba55430dSAndreas Gohr
326ba55430dSAndreas Gohr    #endregion
327eafc109fSAndreas Gohr}
328