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