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