1fa04b28cSMichael Grosse<?php 2fa04b28cSMichael Grosse/** 3fa04b28cSMichael Grosse * DokuWiki Plugin struct (Syntax Component) 4fa04b28cSMichael Grosse * 5fa04b28cSMichael Grosse * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6fa04b28cSMichael Grosse * @author Andreas Gohr, Michael Große <dokuwiki@cosmocode.de> 7fa04b28cSMichael Grosse */ 8fa04b28cSMichael Grosse 9fa04b28cSMichael Grosse// must be run within Dokuwiki 10fa04b28cSMichael Grosseif (!defined('DOKU_INC')) die(); 11fa04b28cSMichael Grosse 12fa04b28cSMichael Grosseuse dokuwiki\plugin\struct\meta\ConfigParser; 13*0699ff47SMichael Grosseuse dokuwiki\plugin\struct\meta\SearchCloud; 14fa04b28cSMichael Grosseuse dokuwiki\plugin\struct\meta\StructException; 15fa04b28cSMichael Grosseuse dokuwiki\plugin\struct\meta\AggregationCloud; 16fa04b28cSMichael Grosse 17fa04b28cSMichael Grosseclass syntax_plugin_struct_cloud extends DokuWiki_Syntax_Plugin { 18fa04b28cSMichael Grosse /** @var string which class to use for output */ 19fa04b28cSMichael Grosse protected $tableclass = AggregationCloud::class; 20fa04b28cSMichael Grosse /** 21fa04b28cSMichael Grosse * @return string Syntax mode type 22fa04b28cSMichael Grosse */ 23fa04b28cSMichael Grosse public function getType() { 24fa04b28cSMichael Grosse return 'substition'; 25fa04b28cSMichael Grosse } 26fa04b28cSMichael Grosse /** 27fa04b28cSMichael Grosse * @return string Paragraph type 28fa04b28cSMichael Grosse */ 29fa04b28cSMichael Grosse public function getPType() { 30fa04b28cSMichael Grosse return 'block'; 31fa04b28cSMichael Grosse } 32fa04b28cSMichael Grosse /** 33fa04b28cSMichael Grosse * @return int Sort order - Low numbers go before high numbers 34fa04b28cSMichael Grosse */ 35fa04b28cSMichael Grosse public function getSort() { 36fa04b28cSMichael Grosse return 151; 37fa04b28cSMichael Grosse } 38fa04b28cSMichael Grosse 39fa04b28cSMichael Grosse /** 40fa04b28cSMichael Grosse * Connect lookup pattern to lexer. 41fa04b28cSMichael Grosse * 42fa04b28cSMichael Grosse * @param string $mode Parser mode 43fa04b28cSMichael Grosse */ 44fa04b28cSMichael Grosse public function connectTo($mode) { 45fa04b28cSMichael Grosse $this->Lexer->addSpecialPattern('----+ *struct cloud *-+\n.*?\n----+',$mode,'plugin_struct_cloud'); 46fa04b28cSMichael Grosse } 47fa04b28cSMichael Grosse 48fa04b28cSMichael Grosse /** 49fa04b28cSMichael Grosse * Handle matches of the struct syntax 50fa04b28cSMichael Grosse * 51fa04b28cSMichael Grosse * @param string $match The match of the syntax 52fa04b28cSMichael Grosse * @param int $state The state of the handler 53fa04b28cSMichael Grosse * @param int $pos The position in the document 54fa04b28cSMichael Grosse * @param Doku_Handler $handler The handler 55fa04b28cSMichael Grosse * @return array Data for the renderer 56fa04b28cSMichael Grosse */ 57fa04b28cSMichael Grosse public function handle($match, $state, $pos, Doku_Handler $handler){ 58fa04b28cSMichael Grosse global $conf; 59fa04b28cSMichael Grosse $lines = explode("\n", $match); 60fa04b28cSMichael Grosse array_shift($lines); 61fa04b28cSMichael Grosse array_pop($lines); 62fa04b28cSMichael Grosse // todo: disallow dynfilters, rownumbers, limit, offset, ... 63fa04b28cSMichael Grosse try { 64fa04b28cSMichael Grosse $parser = new ConfigParser($lines); 65fa04b28cSMichael Grosse $config = $parser->getConfig(); 66fa04b28cSMichael Grosse return $config; 67fa04b28cSMichael Grosse } catch(StructException $e) { 68fa04b28cSMichael Grosse msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 69fa04b28cSMichael Grosse if($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 70fa04b28cSMichael Grosse return null; 71fa04b28cSMichael Grosse } 72fa04b28cSMichael Grosse 73fa04b28cSMichael Grosse } 74fa04b28cSMichael Grosse 75fa04b28cSMichael Grosse /** 76fa04b28cSMichael Grosse * Render xhtml output or metadata 77fa04b28cSMichael Grosse * 78fa04b28cSMichael Grosse * @param string $mode Renderer mode (supported modes: xhtml) 79fa04b28cSMichael Grosse * @param Doku_Renderer $renderer The renderer 80fa04b28cSMichael Grosse * @param array $data The data from the handler() function 81fa04b28cSMichael Grosse * @return bool If rendering was successful. 82fa04b28cSMichael Grosse */ 83fa04b28cSMichael Grosse public function render($mode, Doku_Renderer $renderer, $data) { 84fa04b28cSMichael Grosse if($mode != 'xhtml') return false; 85fa04b28cSMichael Grosse if(!$data) return false; 86fa04b28cSMichael Grosse global $INFO, $conf; 87fa04b28cSMichael Grosse try { 88*0699ff47SMichael Grosse $search = new SearchCloud($data); 89fa04b28cSMichael Grosse /** @var AggregationList $list */ 90fa04b28cSMichael Grosse $list = new $this->tableclass($INFO['id'], $mode, $renderer, $search); 91fa04b28cSMichael Grosse $list->render(); 92fa04b28cSMichael Grosse if($mode == 'metadata') { 93fa04b28cSMichael Grosse /** @var Doku_Renderer_metadata $renderer */ 94fa04b28cSMichael Grosse $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag(); 95fa04b28cSMichael Grosse } 96fa04b28cSMichael Grosse } catch(StructException $e) { 97fa04b28cSMichael Grosse msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 98fa04b28cSMichael Grosse if($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 99fa04b28cSMichael Grosse } 100fa04b28cSMichael Grosse 101fa04b28cSMichael Grosse return true; 102fa04b28cSMichael Grosse } 103fa04b28cSMichael Grosse} 104fa04b28cSMichael Grosse 105fa04b28cSMichael Grosse// vim:ts=4:sw=4:et: 106