1549a0837SAndreas Gohr<?php 261356325SAnna Dabrowska 3549a0837SAndreas Gohr/** 4549a0837SAndreas Gohr * DokuWiki Plugin struct (Syntax Component) 5549a0837SAndreas Gohr * 6549a0837SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 7549a0837SAndreas Gohr * @author Andreas Gohr, Michael Große <dokuwiki@cosmocode.de> 8549a0837SAndreas Gohr */ 9549a0837SAndreas Gohr 10ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\AggregationTable; 11ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\ConfigParser; 12ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\SearchConfig; 13ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\StructException; 1415929be2SAndreas Gohr 1561356325SAnna Dabrowskaclass syntax_plugin_struct_table extends DokuWiki_Syntax_Plugin 1661356325SAnna Dabrowska{ 173f2a8309SAndreas Gohr 183f2a8309SAndreas Gohr /** @var string which class to use for output */ 193f2a8309SAndreas Gohr protected $tableclass = AggregationTable::class; 203f2a8309SAndreas Gohr 21549a0837SAndreas Gohr /** 22549a0837SAndreas Gohr * @return string Syntax mode type 23549a0837SAndreas Gohr */ 2461356325SAnna Dabrowska public function getType() 2561356325SAnna Dabrowska { 2615929be2SAndreas Gohr return 'substition'; 27549a0837SAndreas Gohr } 283f2a8309SAndreas Gohr 29549a0837SAndreas Gohr /** 30549a0837SAndreas Gohr * @return string Paragraph type 31549a0837SAndreas Gohr */ 3261356325SAnna Dabrowska public function getPType() 3361356325SAnna Dabrowska { 3415929be2SAndreas Gohr return 'block'; 35549a0837SAndreas Gohr } 363f2a8309SAndreas Gohr 37549a0837SAndreas Gohr /** 38549a0837SAndreas Gohr * @return int Sort order - Low numbers go before high numbers 39549a0837SAndreas Gohr */ 4061356325SAnna Dabrowska public function getSort() 4161356325SAnna Dabrowska { 425511bd5bSAndreas Gohr return 155; 43549a0837SAndreas Gohr } 44549a0837SAndreas Gohr 45549a0837SAndreas Gohr /** 46549a0837SAndreas Gohr * Connect lookup pattern to lexer. 47549a0837SAndreas Gohr * 48549a0837SAndreas Gohr * @param string $mode Parser mode 49549a0837SAndreas Gohr */ 5061356325SAnna Dabrowska public function connectTo($mode) 5161356325SAnna Dabrowska { 525511bd5bSAndreas Gohr $this->Lexer->addSpecialPattern('----+ *struct table *-+\n.*?\n----+', $mode, 'plugin_struct_table'); 53549a0837SAndreas Gohr } 54549a0837SAndreas Gohr 55549a0837SAndreas Gohr /** 56549a0837SAndreas Gohr * Handle matches of the struct syntax 57549a0837SAndreas Gohr * 58549a0837SAndreas Gohr * @param string $match The match of the syntax 59549a0837SAndreas Gohr * @param int $state The state of the handler 60549a0837SAndreas Gohr * @param int $pos The position in the document 61549a0837SAndreas Gohr * @param Doku_Handler $handler The handler 62549a0837SAndreas Gohr * @return array Data for the renderer 63549a0837SAndreas Gohr */ 6461356325SAnna Dabrowska public function handle($match, $state, $pos, Doku_Handler $handler) 6561356325SAnna Dabrowska { 66bd363da9SAndreas Gohr global $conf; 67549a0837SAndreas Gohr 685511bd5bSAndreas Gohr $lines = explode("\n", $match); 695511bd5bSAndreas Gohr array_shift($lines); 705511bd5bSAndreas Gohr array_pop($lines); 715511bd5bSAndreas Gohr 725511bd5bSAndreas Gohr try { 735511bd5bSAndreas Gohr $parser = new ConfigParser($lines); 740659dc64SMichael Grosse $config = $parser->getConfig(); 750ceefd5cSAnna Dabrowska 760ceefd5cSAnna Dabrowska $config = $this->addTypeFilter($config); 770ceefd5cSAnna Dabrowska 780659dc64SMichael Grosse return $config; 795511bd5bSAndreas Gohr } catch (StructException $e) { 805511bd5bSAndreas Gohr msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 81bd363da9SAndreas Gohr if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 825511bd5bSAndreas Gohr return null; 835511bd5bSAndreas Gohr } 84549a0837SAndreas Gohr } 85549a0837SAndreas Gohr 86549a0837SAndreas Gohr /** 87549a0837SAndreas Gohr * Render xhtml output or metadata 88549a0837SAndreas Gohr * 89*34ea6e10SAnna Dabrowska * @param string $format Renderer mode (supported modes: xhtml) 90549a0837SAndreas Gohr * @param Doku_Renderer $renderer The renderer 91549a0837SAndreas Gohr * @param array $data The data from the handler() function 92549a0837SAndreas Gohr * @return bool If rendering was successful. 93549a0837SAndreas Gohr */ 94*34ea6e10SAnna Dabrowska public function render($format, Doku_Renderer $renderer, $data) 9561356325SAnna Dabrowska { 965511bd5bSAndreas Gohr if (!$data) return false; 97*34ea6e10SAnna Dabrowska 98*34ea6e10SAnna Dabrowska foreach (helper_plugin_struct::BLACKLIST_RENDERER as $blacklisted) { 99*34ea6e10SAnna Dabrowska if ($renderer instanceof $blacklisted) { 100*34ea6e10SAnna Dabrowska return true; 101*34ea6e10SAnna Dabrowska } 102*34ea6e10SAnna Dabrowska } 103*34ea6e10SAnna Dabrowska 10406fee43aSMichael Grosse global $INFO; 105bd363da9SAndreas Gohr global $conf; 10629877279SMichael Große 10715929be2SAndreas Gohr try { 1085511bd5bSAndreas Gohr $search = new SearchConfig($data); 109*34ea6e10SAnna Dabrowska if ($format === 'struct_csv') { 1106ce83f43SAndreas Gohr // no pagination in export 1116ce83f43SAndreas Gohr $search->setLimit(0); 1126ce83f43SAndreas Gohr $search->setOffset(0); 1136ce83f43SAndreas Gohr } 1146ce83f43SAndreas Gohr 1153f2a8309SAndreas Gohr /** @var AggregationTable $table */ 116*34ea6e10SAnna Dabrowska $table = new $this->tableclass($INFO['id'], $format, $renderer, $search); 11707993756SAndreas Gohr $table->render(); 11816b7d914SAndreas Gohr 119*34ea6e10SAnna Dabrowska if ($format === 'metadata') { 12016b7d914SAndreas Gohr /** @var Doku_Renderer_metadata $renderer */ 12116b7d914SAndreas Gohr $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag(); 12216b7d914SAndreas Gohr } 1235511bd5bSAndreas Gohr } catch (StructException $e) { 12415929be2SAndreas Gohr msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 125bd363da9SAndreas Gohr if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 12615929be2SAndreas Gohr } 12715929be2SAndreas Gohr 128549a0837SAndreas Gohr return true; 129549a0837SAndreas Gohr } 1300ceefd5cSAnna Dabrowska 1310ceefd5cSAnna Dabrowska /** 132c797933dSAnna Dabrowska * Filter based on primary key columns, applicable in child classes 1330ceefd5cSAnna Dabrowska * 1340ceefd5cSAnna Dabrowska * @param array $config 1350ceefd5cSAnna Dabrowska * @return array 1360ceefd5cSAnna Dabrowska */ 1370ceefd5cSAnna Dabrowska protected function addTypeFilter($config) 1380ceefd5cSAnna Dabrowska { 1390ceefd5cSAnna Dabrowska return $config; 1400ceefd5cSAnna Dabrowska } 141549a0837SAndreas Gohr} 142