xref: /plugin/struct/renderer/csv.php (revision 7234bfb14e712ff548d9266ef32fdcc8eaf2d04e)
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*7234bfb1Ssplitbrain            !isset($this->info['struct_table_hash']) || $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     */
44748e747fSAnna Dabrowska    public function getFormat()
45d6d97f60SAnna Dabrowska    {
46eafc109fSAndreas Gohr        return 'struct_csv';
47eafc109fSAndreas Gohr    }
48eafc109fSAndreas Gohr
49eafc109fSAndreas Gohr    /**
50eafc109fSAndreas Gohr     * Set proper headers
51eafc109fSAndreas Gohr     */
5217a3a578SAndreas Gohr    public function document_start()
53d6d97f60SAnna Dabrowska    {
54eafc109fSAndreas Gohr        global $ID;
55b22abfe9SAndreas Gohr        $filename = noNS($ID) . '.csv';
56*7234bfb1Ssplitbrain        $headers = ['Content-Type' => 'text/csv', 'Content-Disposition' => 'attachment; filename="' . $filename . '";'];
57*7234bfb1Ssplitbrain        p_set_metadata($ID, ['format' => ['struct_csv' => $headers]]);
58eafc109fSAndreas Gohr        // don't cache
59eafc109fSAndreas Gohr        $this->nocache();
60eafc109fSAndreas Gohr    }
61eafc109fSAndreas Gohr
62eafc109fSAndreas Gohr    /**
63eafc109fSAndreas Gohr     * Opening a table row prevents the separator for the first following cell
64eafc109fSAndreas Gohr     */
6517a3a578SAndreas Gohr    public function tablerow_open()
66d6d97f60SAnna Dabrowska    {
67748e747fSAnna Dabrowska        if (!$this->doOutput()) return;
68eafc109fSAndreas Gohr        $this->first = true;
69eafc109fSAndreas Gohr    }
70eafc109fSAndreas Gohr
71eafc109fSAndreas Gohr    /**
72b22abfe9SAndreas Gohr     * Output the delimiter (unless it's the first cell of this row) and the text wrapper
73eafc109fSAndreas Gohr     *
74eafc109fSAndreas Gohr     * @param int $colspan ignored
75eafc109fSAndreas Gohr     * @param null $align ignored
76eafc109fSAndreas Gohr     * @param int $rowspan ignored
7717a3a578SAndreas Gohr     *
78eafc109fSAndreas Gohr     */
7917a3a578SAndreas Gohr    public function tablecell_open($colspan = 1, $align = null, $rowspan = 1)
80d6d97f60SAnna Dabrowska    {
81748e747fSAnna Dabrowska        if (!$this->doOutput()) return;
82eafc109fSAndreas Gohr        if (!$this->first) {
83b22abfe9SAndreas Gohr            $this->doc .= ",";
84eafc109fSAndreas Gohr        }
85eafc109fSAndreas Gohr        $this->first = false;
86b22abfe9SAndreas Gohr
87b22abfe9SAndreas Gohr        $this->doc .= '"';
88b22abfe9SAndreas Gohr    }
89b22abfe9SAndreas Gohr
90b22abfe9SAndreas Gohr    /**
91b22abfe9SAndreas Gohr     * Close the text wrapper
92b22abfe9SAndreas Gohr     */
9317a3a578SAndreas Gohr    public function tablecell_close()
94d6d97f60SAnna Dabrowska    {
95748e747fSAnna Dabrowska        if (!$this->doOutput()) return;
96b22abfe9SAndreas Gohr        $this->doc .= '"';
97eafc109fSAndreas Gohr    }
98eafc109fSAndreas Gohr
99eafc109fSAndreas Gohr    /**
100eafc109fSAndreas Gohr     * Alias for tablecell_open
101eafc109fSAndreas Gohr     *
102eafc109fSAndreas Gohr     * @param int $colspan ignored
103eafc109fSAndreas Gohr     * @param null $align ignored
104eafc109fSAndreas Gohr     * @param int $rowspan ignored
105eafc109fSAndreas Gohr     */
10617a3a578SAndreas Gohr    public function tableheader_open($colspan = 1, $align = null, $rowspan = 1)
107d6d97f60SAnna Dabrowska    {
108eafc109fSAndreas Gohr        $this->tablecell_open($colspan, $align, $rowspan);
109eafc109fSAndreas Gohr    }
110eafc109fSAndreas Gohr
111eafc109fSAndreas Gohr    /**
112b22abfe9SAndreas Gohr     * Alias for tablecell_close
113b22abfe9SAndreas Gohr     */
11417a3a578SAndreas Gohr    public function tableheader_close()
115d6d97f60SAnna Dabrowska    {
116b22abfe9SAndreas Gohr        $this->tablecell_close();
117b22abfe9SAndreas Gohr    }
118b22abfe9SAndreas Gohr
119b22abfe9SAndreas Gohr    /**
120b22abfe9SAndreas Gohr     * Add CRLF newline at the end of one line
121eafc109fSAndreas Gohr     */
12217a3a578SAndreas Gohr    public function tablerow_close()
123d6d97f60SAnna Dabrowska    {
124748e747fSAnna Dabrowska        if (!$this->doOutput()) return;
125b22abfe9SAndreas Gohr        $this->doc .= "\r\n";
126eafc109fSAndreas Gohr    }
127eafc109fSAndreas Gohr
128eafc109fSAndreas Gohr    /**
129eafc109fSAndreas Gohr     * Outputs cell content
130eafc109fSAndreas Gohr     *
131eafc109fSAndreas Gohr     * @param string $text
132eafc109fSAndreas Gohr     */
133748e747fSAnna Dabrowska    public function cdata($text)
134d6d97f60SAnna Dabrowska    {
135748e747fSAnna Dabrowska        if (!$this->doOutput()) return;
136b22abfe9SAndreas Gohr        if ($text === '') return;
137b22abfe9SAndreas Gohr
138b22abfe9SAndreas Gohr        $this->doc .= str_replace('"', '""', $text);
139eafc109fSAndreas Gohr    }
140eafc109fSAndreas Gohr
141ba55430dSAndreas Gohr
142ba55430dSAndreas Gohr    #region overrides using cdata for output
143ba55430dSAndreas Gohr
144748e747fSAnna Dabrowska    public function internallink($link, $title = null)
145d6d97f60SAnna Dabrowska    {
146*7234bfb1Ssplitbrain        if (is_null($title) || is_array($title) || $title == '') {
147ba55430dSAndreas Gohr            $title = $this->_simpleTitle($link);
148ba55430dSAndreas Gohr        }
149eafc109fSAndreas Gohr        $this->cdata($title);
150eafc109fSAndreas Gohr    }
151eafc109fSAndreas Gohr
152748e747fSAnna Dabrowska    public function externallink($link, $title = null)
153d6d97f60SAnna Dabrowska    {
154*7234bfb1Ssplitbrain        if (is_null($title) || is_array($title) || $title == '') {
155ba55430dSAndreas Gohr            $title = $link;
156ba55430dSAndreas Gohr        }
157ba55430dSAndreas Gohr        $this->cdata($title);
158ba55430dSAndreas Gohr    }
159ba55430dSAndreas Gohr
160748e747fSAnna Dabrowska    public function emaillink($address, $name = null)
161d6d97f60SAnna Dabrowska    {
16249fe301bSAndreas Gohr        $this->cdata($address);
16349fe301bSAndreas Gohr    }
164ba55430dSAndreas Gohr
165748e747fSAnna Dabrowska    public function plugin($name, $args, $state = '', $match = '')
166d6d97f60SAnna Dabrowska    {
167470e44beSAndreas Gohr        if (substr($name, 0, 7) == 'struct_') {
168470e44beSAndreas Gohr            parent::plugin($name, $args, $state, $match);
169470e44beSAndreas Gohr        } else {
170ba55430dSAndreas Gohr            $this->cdata($match);
171ba55430dSAndreas Gohr        }
172470e44beSAndreas Gohr    }
173ba55430dSAndreas Gohr
174748e747fSAnna Dabrowska    public function acronym($acronym)
175d6d97f60SAnna Dabrowska    {
176ba55430dSAndreas Gohr        $this->cdata($acronym);
177ba55430dSAndreas Gohr    }
178ba55430dSAndreas Gohr
179748e747fSAnna Dabrowska    public function code($text, $lang = null, $file = null)
180d6d97f60SAnna Dabrowska    {
181ba55430dSAndreas Gohr        $this->cdata($text);
182ba55430dSAndreas Gohr    }
183ba55430dSAndreas Gohr
184748e747fSAnna Dabrowska    public function header($text, $level, $pos)
185d6d97f60SAnna Dabrowska    {
186ba55430dSAndreas Gohr        $this->cdata($text);
187ba55430dSAndreas Gohr    }
188ba55430dSAndreas Gohr
189748e747fSAnna Dabrowska    public function linebreak()
190d6d97f60SAnna Dabrowska    {
191ba55430dSAndreas Gohr        $this->cdata("\r\n");
192ba55430dSAndreas Gohr    }
193ba55430dSAndreas Gohr
194748e747fSAnna Dabrowska    public function unformatted($text)
195d6d97f60SAnna Dabrowska    {
196ba55430dSAndreas Gohr        $this->cdata($text);
197ba55430dSAndreas Gohr    }
198ba55430dSAndreas Gohr
199748e747fSAnna Dabrowska    public function php($text)
200d6d97f60SAnna Dabrowska    {
201ba55430dSAndreas Gohr        $this->cdata($text);
202ba55430dSAndreas Gohr    }
203ba55430dSAndreas Gohr
204748e747fSAnna Dabrowska    public function phpblock($text)
205d6d97f60SAnna Dabrowska    {
206ba55430dSAndreas Gohr        $this->cdata($text);
207ba55430dSAndreas Gohr    }
208ba55430dSAndreas Gohr
209748e747fSAnna Dabrowska    public function html($text)
210d6d97f60SAnna Dabrowska    {
211ba55430dSAndreas Gohr        $this->cdata($text);
212ba55430dSAndreas Gohr    }
213ba55430dSAndreas Gohr
214748e747fSAnna Dabrowska    public function htmlblock($text)
215d6d97f60SAnna Dabrowska    {
216ba55430dSAndreas Gohr        $this->cdata($text);
217ba55430dSAndreas Gohr    }
218ba55430dSAndreas Gohr
219748e747fSAnna Dabrowska    public function preformatted($text)
220d6d97f60SAnna Dabrowska    {
221ba55430dSAndreas Gohr        $this->cdata($text);
222ba55430dSAndreas Gohr    }
223ba55430dSAndreas Gohr
224748e747fSAnna Dabrowska    public function file($text, $lang = null, $file = null)
225d6d97f60SAnna Dabrowska    {
226ba55430dSAndreas Gohr        $this->cdata($text);
227ba55430dSAndreas Gohr    }
228ba55430dSAndreas Gohr
229748e747fSAnna Dabrowska    public function smiley($smiley)
230d6d97f60SAnna Dabrowska    {
231ba55430dSAndreas Gohr        $this->cdata($smiley);
232ba55430dSAndreas Gohr    }
233ba55430dSAndreas Gohr
234748e747fSAnna Dabrowska    public function entity($entity)
235d6d97f60SAnna Dabrowska    {
236ba55430dSAndreas Gohr        $this->cdata($entity);
237ba55430dSAndreas Gohr    }
238ba55430dSAndreas Gohr
239748e747fSAnna Dabrowska    public function multiplyentity($x, $y)
240d6d97f60SAnna Dabrowska    {
241ba55430dSAndreas Gohr        $this->cdata($x . 'x' . $y);
242ba55430dSAndreas Gohr    }
243ba55430dSAndreas Gohr
244748e747fSAnna Dabrowska    public function locallink($hash, $name = null)
245d6d97f60SAnna Dabrowska    {
246*7234bfb1Ssplitbrain        if (is_null($name) || is_array($name) || $name == '') {
247ba55430dSAndreas Gohr            $name = $hash;
248ba55430dSAndreas Gohr        }
249ba55430dSAndreas Gohr        $this->cdata($name);
250ba55430dSAndreas Gohr    }
251ba55430dSAndreas Gohr
252748e747fSAnna Dabrowska    public function interwikilink($link, $title, $wikiName, $wikiUri)
253d6d97f60SAnna Dabrowska    {
254*7234bfb1Ssplitbrain        if (is_array($title) || $title == '') {
255ba55430dSAndreas Gohr            $title = $wikiName . '>' . $link;
256ba55430dSAndreas Gohr        }
257ba55430dSAndreas Gohr        $this->cdata($title);
258ba55430dSAndreas Gohr    }
259ba55430dSAndreas Gohr
260748e747fSAnna Dabrowska    public function filelink($link, $title = null)
261d6d97f60SAnna Dabrowska    {
262*7234bfb1Ssplitbrain        if (is_null($title) || is_array($title) || $title == '') {
263ba55430dSAndreas Gohr            $title = $link;
264ba55430dSAndreas Gohr        }
265ba55430dSAndreas Gohr        $this->cdata($title);
266ba55430dSAndreas Gohr    }
267ba55430dSAndreas Gohr
268748e747fSAnna Dabrowska    public function windowssharelink($link, $title = null)
269d6d97f60SAnna Dabrowska    {
270*7234bfb1Ssplitbrain        if (is_null($title) || is_array($title) || $title == '') {
271ba55430dSAndreas Gohr            $title = $link;
272ba55430dSAndreas Gohr        }
273ba55430dSAndreas Gohr        $this->cdata($title);
274ba55430dSAndreas Gohr    }
275ba55430dSAndreas Gohr
276748e747fSAnna Dabrowska    public function internalmedia(
277d6d97f60SAnna Dabrowska        $src,
278d6d97f60SAnna Dabrowska        $title = null,
279d6d97f60SAnna Dabrowska        $align = null,
280d6d97f60SAnna Dabrowska        $width = null,
281d6d97f60SAnna Dabrowska        $height = null,
282d6d97f60SAnna Dabrowska        $cache = null,
283d6d97f60SAnna Dabrowska        $linking = null
284d6d97f60SAnna Dabrowska    ) {
285ba55430dSAndreas Gohr        $this->cdata($src);
286ba55430dSAndreas Gohr    }
287ba55430dSAndreas Gohr
288748e747fSAnna Dabrowska    public function externalmedia(
289d6d97f60SAnna Dabrowska        $src,
290d6d97f60SAnna Dabrowska        $title = null,
291d6d97f60SAnna Dabrowska        $align = null,
292d6d97f60SAnna Dabrowska        $width = null,
293d6d97f60SAnna Dabrowska        $height = null,
294d6d97f60SAnna Dabrowska        $cache = null,
295d6d97f60SAnna Dabrowska        $linking = null
296d6d97f60SAnna Dabrowska    ) {
297ba55430dSAndreas Gohr        $this->cdata($src);
298ba55430dSAndreas Gohr    }
299ba55430dSAndreas Gohr
300748e747fSAnna Dabrowska    public function internalmedialink(
301d6d97f60SAnna Dabrowska        $src,
302d6d97f60SAnna Dabrowska        $title = null,
303d6d97f60SAnna Dabrowska        $align = null,
304d6d97f60SAnna Dabrowska        $width = null,
305d6d97f60SAnna Dabrowska        $height = null,
306d6d97f60SAnna Dabrowska        $cache = null
307d6d97f60SAnna Dabrowska    ) {
308ba55430dSAndreas Gohr        $this->cdata($src);
309ba55430dSAndreas Gohr    }
310ba55430dSAndreas Gohr
311748e747fSAnna Dabrowska    public function externalmedialink(
312d6d97f60SAnna Dabrowska        $src,
313d6d97f60SAnna Dabrowska        $title = null,
314d6d97f60SAnna Dabrowska        $align = null,
315d6d97f60SAnna Dabrowska        $width = null,
316d6d97f60SAnna Dabrowska        $height = null,
317d6d97f60SAnna Dabrowska        $cache = null
318d6d97f60SAnna Dabrowska    ) {
319ba55430dSAndreas Gohr        $this->cdata($src);
320ba55430dSAndreas Gohr    }
321ba55430dSAndreas Gohr
322ba55430dSAndreas Gohr    #endregion
323eafc109fSAndreas Gohr}
324