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