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