1549a0837SAndreas Gohr<?php 2*61356325SAnna 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 1507993756SAndreas Gohr// must be run within Dokuwiki 16549a0837SAndreas Gohrif (!defined('DOKU_INC')) die(); 17549a0837SAndreas Gohr 18*61356325SAnna Dabrowskaclass syntax_plugin_struct_table extends DokuWiki_Syntax_Plugin 19*61356325SAnna Dabrowska{ 203f2a8309SAndreas Gohr 213f2a8309SAndreas Gohr /** @var string which class to use for output */ 223f2a8309SAndreas Gohr protected $tableclass = AggregationTable::class; 23d400a5f0SAnna Dabrowska protected $idColumn = 'pid'; 243f2a8309SAndreas Gohr 25549a0837SAndreas Gohr /** 26549a0837SAndreas Gohr * @return string Syntax mode type 27549a0837SAndreas Gohr */ 28*61356325SAnna Dabrowska public function getType() 29*61356325SAnna Dabrowska { 3015929be2SAndreas Gohr return 'substition'; 31549a0837SAndreas Gohr } 323f2a8309SAndreas Gohr 33549a0837SAndreas Gohr /** 34549a0837SAndreas Gohr * @return string Paragraph type 35549a0837SAndreas Gohr */ 36*61356325SAnna Dabrowska public function getPType() 37*61356325SAnna Dabrowska { 3815929be2SAndreas Gohr return 'block'; 39549a0837SAndreas Gohr } 403f2a8309SAndreas Gohr 41549a0837SAndreas Gohr /** 42549a0837SAndreas Gohr * @return int Sort order - Low numbers go before high numbers 43549a0837SAndreas Gohr */ 44*61356325SAnna Dabrowska public function getSort() 45*61356325SAnna Dabrowska { 465511bd5bSAndreas Gohr return 155; 47549a0837SAndreas Gohr } 48549a0837SAndreas Gohr 49549a0837SAndreas Gohr /** 50549a0837SAndreas Gohr * Connect lookup pattern to lexer. 51549a0837SAndreas Gohr * 52549a0837SAndreas Gohr * @param string $mode Parser mode 53549a0837SAndreas Gohr */ 54*61356325SAnna Dabrowska public function connectTo($mode) 55*61356325SAnna Dabrowska { 565511bd5bSAndreas Gohr $this->Lexer->addSpecialPattern('----+ *struct table *-+\n.*?\n----+', $mode, 'plugin_struct_table'); 57549a0837SAndreas Gohr } 58549a0837SAndreas Gohr 59549a0837SAndreas Gohr /** 60549a0837SAndreas Gohr * Handle matches of the struct syntax 61549a0837SAndreas Gohr * 62549a0837SAndreas Gohr * @param string $match The match of the syntax 63549a0837SAndreas Gohr * @param int $state The state of the handler 64549a0837SAndreas Gohr * @param int $pos The position in the document 65549a0837SAndreas Gohr * @param Doku_Handler $handler The handler 66549a0837SAndreas Gohr * @return array Data for the renderer 67549a0837SAndreas Gohr */ 68*61356325SAnna Dabrowska public function handle($match, $state, $pos, Doku_Handler $handler) 69*61356325SAnna Dabrowska { 70bd363da9SAndreas Gohr global $conf; 71549a0837SAndreas Gohr 725511bd5bSAndreas Gohr $lines = explode("\n", $match); 735511bd5bSAndreas Gohr array_shift($lines); 745511bd5bSAndreas Gohr array_pop($lines); 755511bd5bSAndreas Gohr 765511bd5bSAndreas Gohr try { 775511bd5bSAndreas Gohr $parser = new ConfigParser($lines); 780659dc64SMichael Grosse $config = $parser->getConfig(); 790ceefd5cSAnna Dabrowska 800ceefd5cSAnna Dabrowska $config = $this->addTypeFilter($config); 810ceefd5cSAnna Dabrowska 820659dc64SMichael Grosse return $config; 835511bd5bSAndreas Gohr } catch (StructException $e) { 845511bd5bSAndreas Gohr msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 85bd363da9SAndreas Gohr if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 865511bd5bSAndreas Gohr return null; 875511bd5bSAndreas Gohr } 88549a0837SAndreas Gohr } 89549a0837SAndreas Gohr 90549a0837SAndreas Gohr /** 91549a0837SAndreas Gohr * Render xhtml output or metadata 92549a0837SAndreas Gohr * 93549a0837SAndreas Gohr * @param string $mode Renderer mode (supported modes: xhtml) 94549a0837SAndreas Gohr * @param Doku_Renderer $renderer The renderer 95549a0837SAndreas Gohr * @param array $data The data from the handler() function 96549a0837SAndreas Gohr * @return bool If rendering was successful. 97549a0837SAndreas Gohr */ 98*61356325SAnna Dabrowska public function render($mode, Doku_Renderer $renderer, $data) 99*61356325SAnna Dabrowska { 1005511bd5bSAndreas Gohr if (!$data) return false; 10106fee43aSMichael Grosse global $INFO; 102bd363da9SAndreas Gohr global $conf; 10329877279SMichael Große 10415929be2SAndreas Gohr try { 1055511bd5bSAndreas Gohr $search = new SearchConfig($data); 1066ce83f43SAndreas Gohr if ($mode == 'struct_csv') { 1076ce83f43SAndreas Gohr // no pagination in export 1086ce83f43SAndreas Gohr $search->setLimit(0); 1096ce83f43SAndreas Gohr $search->setOffset(0); 1106ce83f43SAndreas Gohr } 1116ce83f43SAndreas Gohr 1123f2a8309SAndreas Gohr /** @var AggregationTable $table */ 113d400a5f0SAnna Dabrowska $table = new $this->tableclass($INFO['id'], $mode, $renderer, $search, $this->idColumn); 11407993756SAndreas Gohr $table->render(); 11516b7d914SAndreas Gohr 11616b7d914SAndreas Gohr if ($mode == 'metadata') { 11716b7d914SAndreas Gohr /** @var Doku_Renderer_metadata $renderer */ 11816b7d914SAndreas Gohr $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag(); 11916b7d914SAndreas Gohr } 1205511bd5bSAndreas Gohr } catch (StructException $e) { 12115929be2SAndreas Gohr msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 122bd363da9SAndreas Gohr if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 12315929be2SAndreas Gohr } 12415929be2SAndreas Gohr 125549a0837SAndreas Gohr return true; 126549a0837SAndreas Gohr } 1270ceefd5cSAnna Dabrowska 1280ceefd5cSAnna Dabrowska /** 1290ceefd5cSAnna Dabrowska * Filter based on primary key columns 1300ceefd5cSAnna Dabrowska * 1310ceefd5cSAnna Dabrowska * @param array $config 1320ceefd5cSAnna Dabrowska * @return array 1330ceefd5cSAnna Dabrowska */ 1340ceefd5cSAnna Dabrowska protected function addTypeFilter($config) 1350ceefd5cSAnna Dabrowska { 1360ceefd5cSAnna Dabrowska $config['filter'][] = ['%rowid%', '=', (string)\dokuwiki\plugin\struct\meta\AccessTableData::DEFAULT_PAGE_RID, 'AND']; 1370ceefd5cSAnna Dabrowska return $config; 1380ceefd5cSAnna Dabrowska } 139549a0837SAndreas Gohr} 140