xref: /plugin/struct/renderer/csv.php (revision 748e747f37aa44250ee32847b5fc3ff1e47f0835)
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 */
11d6d97f60SAnna Dabrowskaclass renderer_plugin_struct_csv extends Doku_Renderer
12d6d97f60SAnna 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*748e747fSAnna Dabrowska    protected function doOutput()
22d6d97f60SAnna 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*748e747fSAnna Dabrowska    public function getFormat()
45d6d97f60SAnna Dabrowska    {
46eafc109fSAndreas Gohr        return 'struct_csv';
47eafc109fSAndreas Gohr    }
48eafc109fSAndreas Gohr
49eafc109fSAndreas Gohr    /**
50eafc109fSAndreas Gohr     * Set proper headers
51eafc109fSAndreas Gohr     */
52*748e747fSAnna Dabrowska    public function document_start() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
53d6d97f60SAnna 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*748e747fSAnna Dabrowska    public function tablerow_open() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
69d6d97f60SAnna Dabrowska    {
70*748e747fSAnna Dabrowska        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*748e747fSAnna Dabrowska    public function tablecell_open($colspan = 1, $align = null, $rowspan = 1) // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
82d6d97f60SAnna Dabrowska    {
83*748e747fSAnna Dabrowska        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*748e747fSAnna Dabrowska    public function tablecell_close() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
96d6d97f60SAnna Dabrowska    {
97*748e747fSAnna Dabrowska        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*748e747fSAnna Dabrowska    public function tableheader_open($colspan = 1, $align = null, $rowspan = 1) // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
109d6d97f60SAnna Dabrowska    {
110eafc109fSAndreas Gohr        $this->tablecell_open($colspan, $align, $rowspan);
111eafc109fSAndreas Gohr    }
112eafc109fSAndreas Gohr
113eafc109fSAndreas Gohr    /**
114b22abfe9SAndreas Gohr     * Alias for tablecell_close
115b22abfe9SAndreas Gohr     */
116*748e747fSAnna Dabrowska    public function tableheader_close() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
117d6d97f60SAnna 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*748e747fSAnna Dabrowska    public function tablerow_close() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
125d6d97f60SAnna Dabrowska    {
126*748e747fSAnna Dabrowska        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*748e747fSAnna Dabrowska    public function cdata($text)
136d6d97f60SAnna Dabrowska    {
137*748e747fSAnna Dabrowska        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*748e747fSAnna Dabrowska    public function internallink($link, $title = null)
147d6d97f60SAnna 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*748e747fSAnna Dabrowska    public function externallink($link, $title = null)
155d6d97f60SAnna 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*748e747fSAnna Dabrowska    public function emaillink($address, $name = null)
163d6d97f60SAnna Dabrowska    {
16449fe301bSAndreas Gohr        $this->cdata($address);
16549fe301bSAndreas Gohr    }
166ba55430dSAndreas Gohr
167*748e747fSAnna Dabrowska    public function plugin($name, $args, $state = '', $match = '')
168d6d97f60SAnna 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*748e747fSAnna Dabrowska    public function acronym($acronym)
177d6d97f60SAnna Dabrowska    {
178ba55430dSAndreas Gohr        $this->cdata($acronym);
179ba55430dSAndreas Gohr    }
180ba55430dSAndreas Gohr
181*748e747fSAnna Dabrowska    public function code($text, $lang = null, $file = null)
182d6d97f60SAnna Dabrowska    {
183ba55430dSAndreas Gohr        $this->cdata($text);
184ba55430dSAndreas Gohr    }
185ba55430dSAndreas Gohr
186*748e747fSAnna Dabrowska    public function header($text, $level, $pos)
187d6d97f60SAnna Dabrowska    {
188ba55430dSAndreas Gohr        $this->cdata($text);
189ba55430dSAndreas Gohr    }
190ba55430dSAndreas Gohr
191*748e747fSAnna Dabrowska    public function linebreak()
192d6d97f60SAnna Dabrowska    {
193ba55430dSAndreas Gohr        $this->cdata("\r\n");
194ba55430dSAndreas Gohr    }
195ba55430dSAndreas Gohr
196*748e747fSAnna Dabrowska    public function unformatted($text)
197d6d97f60SAnna Dabrowska    {
198ba55430dSAndreas Gohr        $this->cdata($text);
199ba55430dSAndreas Gohr    }
200ba55430dSAndreas Gohr
201*748e747fSAnna Dabrowska    public function php($text)
202d6d97f60SAnna Dabrowska    {
203ba55430dSAndreas Gohr        $this->cdata($text);
204ba55430dSAndreas Gohr    }
205ba55430dSAndreas Gohr
206*748e747fSAnna Dabrowska    public function phpblock($text)
207d6d97f60SAnna Dabrowska    {
208ba55430dSAndreas Gohr        $this->cdata($text);
209ba55430dSAndreas Gohr    }
210ba55430dSAndreas Gohr
211*748e747fSAnna Dabrowska    public function html($text)
212d6d97f60SAnna Dabrowska    {
213ba55430dSAndreas Gohr        $this->cdata($text);
214ba55430dSAndreas Gohr    }
215ba55430dSAndreas Gohr
216*748e747fSAnna Dabrowska    public function htmlblock($text)
217d6d97f60SAnna Dabrowska    {
218ba55430dSAndreas Gohr        $this->cdata($text);
219ba55430dSAndreas Gohr    }
220ba55430dSAndreas Gohr
221*748e747fSAnna Dabrowska    public function preformatted($text)
222d6d97f60SAnna Dabrowska    {
223ba55430dSAndreas Gohr        $this->cdata($text);
224ba55430dSAndreas Gohr    }
225ba55430dSAndreas Gohr
226*748e747fSAnna Dabrowska    public function file($text, $lang = null, $file = null)
227d6d97f60SAnna Dabrowska    {
228ba55430dSAndreas Gohr        $this->cdata($text);
229ba55430dSAndreas Gohr    }
230ba55430dSAndreas Gohr
231*748e747fSAnna Dabrowska    public function smiley($smiley)
232d6d97f60SAnna Dabrowska    {
233ba55430dSAndreas Gohr        $this->cdata($smiley);
234ba55430dSAndreas Gohr    }
235ba55430dSAndreas Gohr
236*748e747fSAnna Dabrowska    public function entity($entity)
237d6d97f60SAnna Dabrowska    {
238ba55430dSAndreas Gohr        $this->cdata($entity);
239ba55430dSAndreas Gohr    }
240ba55430dSAndreas Gohr
241*748e747fSAnna Dabrowska    public function multiplyentity($x, $y)
242d6d97f60SAnna Dabrowska    {
243ba55430dSAndreas Gohr        $this->cdata($x . 'x' . $y);
244ba55430dSAndreas Gohr    }
245ba55430dSAndreas Gohr
246*748e747fSAnna Dabrowska    public function locallink($hash, $name = null)
247d6d97f60SAnna 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*748e747fSAnna Dabrowska    public function interwikilink($link, $title, $wikiName, $wikiUri)
255d6d97f60SAnna Dabrowska    {
256*748e747fSAnna Dabrowska        if (is_array($title) or $title == '') {
257ba55430dSAndreas Gohr            $title = $wikiName . '>' . $link;
258ba55430dSAndreas Gohr        }
259ba55430dSAndreas Gohr        $this->cdata($title);
260ba55430dSAndreas Gohr    }
261ba55430dSAndreas Gohr
262*748e747fSAnna Dabrowska    public function filelink($link, $title = null)
263d6d97f60SAnna 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*748e747fSAnna Dabrowska    public function windowssharelink($link, $title = null)
271d6d97f60SAnna 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*748e747fSAnna Dabrowska    public function internalmedia(
279d6d97f60SAnna Dabrowska        $src,
280d6d97f60SAnna Dabrowska        $title = null,
281d6d97f60SAnna Dabrowska        $align = null,
282d6d97f60SAnna Dabrowska        $width = null,
283d6d97f60SAnna Dabrowska        $height = null,
284d6d97f60SAnna Dabrowska        $cache = null,
285d6d97f60SAnna Dabrowska        $linking = null
286d6d97f60SAnna Dabrowska    ) {
287ba55430dSAndreas Gohr        $this->cdata($src);
288ba55430dSAndreas Gohr    }
289ba55430dSAndreas Gohr
290*748e747fSAnna Dabrowska    public function externalmedia(
291d6d97f60SAnna Dabrowska        $src,
292d6d97f60SAnna Dabrowska        $title = null,
293d6d97f60SAnna Dabrowska        $align = null,
294d6d97f60SAnna Dabrowska        $width = null,
295d6d97f60SAnna Dabrowska        $height = null,
296d6d97f60SAnna Dabrowska        $cache = null,
297d6d97f60SAnna Dabrowska        $linking = null
298d6d97f60SAnna Dabrowska    ) {
299ba55430dSAndreas Gohr        $this->cdata($src);
300ba55430dSAndreas Gohr    }
301ba55430dSAndreas Gohr
302*748e747fSAnna Dabrowska    public function internalmedialink(
303d6d97f60SAnna Dabrowska        $src,
304d6d97f60SAnna Dabrowska        $title = null,
305d6d97f60SAnna Dabrowska        $align = null,
306d6d97f60SAnna Dabrowska        $width = null,
307d6d97f60SAnna Dabrowska        $height = null,
308d6d97f60SAnna Dabrowska        $cache = null
309d6d97f60SAnna Dabrowska    ) {
310ba55430dSAndreas Gohr        $this->cdata($src);
311ba55430dSAndreas Gohr    }
312ba55430dSAndreas Gohr
313*748e747fSAnna Dabrowska    public function externalmedialink(
314d6d97f60SAnna Dabrowska        $src,
315d6d97f60SAnna Dabrowska        $title = null,
316d6d97f60SAnna Dabrowska        $align = null,
317d6d97f60SAnna Dabrowska        $width = null,
318d6d97f60SAnna Dabrowska        $height = null,
319d6d97f60SAnna Dabrowska        $cache = null
320d6d97f60SAnna Dabrowska    ) {
321ba55430dSAndreas Gohr        $this->cdata($src);
322ba55430dSAndreas Gohr    }
323ba55430dSAndreas Gohr
324ba55430dSAndreas Gohr    #endregion
325eafc109fSAndreas Gohr}
326