1549a0837SAndreas Gohr<?php 2*d6d97f60SAnna 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 10ea5ad12aSMichael Grosseuse dokuwiki\plugin\struct\meta\AggregationList; 11ea5ad12aSMichael Grosseuse dokuwiki\plugin\struct\meta\ConfigParser; 12ea5ad12aSMichael Grosseuse dokuwiki\plugin\struct\meta\SearchConfig; 13ea5ad12aSMichael Grosseuse dokuwiki\plugin\struct\meta\StructException; 14ea5ad12aSMichael Grosse 15549a0837SAndreas Gohr// must be run within Dokuwiki 16549a0837SAndreas Gohrif (!defined('DOKU_INC')) die(); 17549a0837SAndreas Gohr 18*d6d97f60SAnna Dabrowskaclass syntax_plugin_struct_list extends DokuWiki_Syntax_Plugin 19*d6d97f60SAnna Dabrowska{ 20ea5ad12aSMichael Grosse 21ea5ad12aSMichael Grosse /** @var string which class to use for output */ 22ea5ad12aSMichael Grosse protected $tableclass = AggregationList::class; 23ea5ad12aSMichael Grosse 24549a0837SAndreas Gohr /** 25549a0837SAndreas Gohr * @return string Syntax mode type 26549a0837SAndreas Gohr */ 27*d6d97f60SAnna Dabrowska public function getType() 28*d6d97f60SAnna Dabrowska { 29ea5ad12aSMichael Grosse return 'substition'; 30549a0837SAndreas Gohr } 31549a0837SAndreas Gohr /** 32549a0837SAndreas Gohr * @return string Paragraph type 33549a0837SAndreas Gohr */ 34*d6d97f60SAnna Dabrowska public function getPType() 35*d6d97f60SAnna Dabrowska { 36ea5ad12aSMichael Grosse return 'block'; 37549a0837SAndreas Gohr } 38549a0837SAndreas Gohr /** 39549a0837SAndreas Gohr * @return int Sort order - Low numbers go before high numbers 40549a0837SAndreas Gohr */ 41*d6d97f60SAnna Dabrowska public function getSort() 42*d6d97f60SAnna Dabrowska { 43ea5ad12aSMichael Grosse return 155; 44549a0837SAndreas Gohr } 45549a0837SAndreas Gohr 46549a0837SAndreas Gohr /** 47549a0837SAndreas Gohr * Connect lookup pattern to lexer. 48549a0837SAndreas Gohr * 49549a0837SAndreas Gohr * @param string $mode Parser mode 50549a0837SAndreas Gohr */ 51*d6d97f60SAnna Dabrowska public function connectTo($mode) 52*d6d97f60SAnna Dabrowska { 53ea5ad12aSMichael Grosse $this->Lexer->addSpecialPattern('----+ *struct list *-+\n.*?\n----+', $mode, 'plugin_struct_list'); 54549a0837SAndreas Gohr } 55549a0837SAndreas Gohr 56549a0837SAndreas Gohr /** 57549a0837SAndreas Gohr * Handle matches of the struct syntax 58549a0837SAndreas Gohr * 59549a0837SAndreas Gohr * @param string $match The match of the syntax 60549a0837SAndreas Gohr * @param int $state The state of the handler 61549a0837SAndreas Gohr * @param int $pos The position in the document 62549a0837SAndreas Gohr * @param Doku_Handler $handler The handler 63549a0837SAndreas Gohr * @return array Data for the renderer 64549a0837SAndreas Gohr */ 65*d6d97f60SAnna Dabrowska public function handle($match, $state, $pos, Doku_Handler $handler) 66*d6d97f60SAnna Dabrowska { 67ea5ad12aSMichael Grosse global $conf; 68549a0837SAndreas Gohr 69ea5ad12aSMichael Grosse $lines = explode("\n", $match); 70ea5ad12aSMichael Grosse array_shift($lines); 71ea5ad12aSMichael Grosse array_pop($lines); 72ea5ad12aSMichael Grosse 73ea5ad12aSMichael Grosse try { 74ea5ad12aSMichael Grosse $parser = new ConfigParser($lines); 75ea5ad12aSMichael Grosse $config = $parser->getConfig(); 76ea5ad12aSMichael Grosse return $config; 77ea5ad12aSMichael Grosse } catch (StructException $e) { 78ea5ad12aSMichael Grosse msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 79ea5ad12aSMichael Grosse if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 80ea5ad12aSMichael Grosse return null; 81ea5ad12aSMichael Grosse } 82ea5ad12aSMichael Grosse } 83ea5ad12aSMichael Grosse 84ea5ad12aSMichael Grosse /** 85ea5ad12aSMichael Grosse * Checks for options that do not work in a list aggregation 86ea5ad12aSMichael Grosse * 87ea5ad12aSMichael Grosse * @param array $config 88ea5ad12aSMichael Grosse */ 89*d6d97f60SAnna Dabrowska protected function checkForInvalidOptions($config) 90*d6d97f60SAnna Dabrowska { 91ea5ad12aSMichael Grosse $illegal = ['dynfilters', 'summarize', 'rownumbers', 'widths', 'summary']; 92ea5ad12aSMichael Grosse foreach ($illegal as $illegalOption) 93ea5ad12aSMichael Grosse if (!empty($config[$illegalOption])) { 94ea5ad12aSMichael Grosse throw new StructException('illegal option', $illegalOption); 95ea5ad12aSMichael Grosse } 96549a0837SAndreas Gohr } 97549a0837SAndreas Gohr 98549a0837SAndreas Gohr /** 99549a0837SAndreas Gohr * Render xhtml output or metadata 100549a0837SAndreas Gohr * 101549a0837SAndreas Gohr * @param string $mode Renderer mode (supported modes: xhtml) 102549a0837SAndreas Gohr * @param Doku_Renderer $renderer The renderer 103549a0837SAndreas Gohr * @param array $data The data from the handler() function 104549a0837SAndreas Gohr * @return bool If rendering was successful. 105549a0837SAndreas Gohr */ 106*d6d97f60SAnna Dabrowska public function render($mode, Doku_Renderer $renderer, $data) 107*d6d97f60SAnna Dabrowska { 108549a0837SAndreas Gohr if ($mode != 'xhtml') return false; 109ea5ad12aSMichael Grosse if (!$data) return false; 110ea5ad12aSMichael Grosse global $INFO; 111ea5ad12aSMichael Grosse global $conf; 112ea5ad12aSMichael Grosse 113ea5ad12aSMichael Grosse try { 114ea5ad12aSMichael Grosse $this->checkForInvalidOptions($data); 115ea5ad12aSMichael Grosse $search = new SearchConfig($data); 116ea5ad12aSMichael Grosse 117ea5ad12aSMichael Grosse /** @var AggregationList $list */ 118ea5ad12aSMichael Grosse $list = new $this->tableclass($INFO['id'], $mode, $renderer, $search); 119ea5ad12aSMichael Grosse $list->render(); 120ea5ad12aSMichael Grosse 121ea5ad12aSMichael Grosse if ($mode == 'metadata') { 122ea5ad12aSMichael Grosse /** @var Doku_Renderer_metadata $renderer */ 123ea5ad12aSMichael Grosse $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag(); 124ea5ad12aSMichael Grosse } 125ea5ad12aSMichael Grosse } catch (StructException $e) { 126ea5ad12aSMichael Grosse msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 127ea5ad12aSMichael Grosse if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 128ea5ad12aSMichael Grosse } 129549a0837SAndreas Gohr 130549a0837SAndreas Gohr return true; 131549a0837SAndreas Gohr } 132549a0837SAndreas Gohr} 133549a0837SAndreas Gohr 134549a0837SAndreas Gohr// vim:ts=4:sw=4:et: 135