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