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