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*7234bfb1Ssplitbrainuse dokuwiki\Extension\SyntaxPlugin; 110549dcc5SAndreas Gohruse dokuwiki\plugin\struct\meta\AggregationCloud; 12fa04b28cSMichael Grosseuse dokuwiki\plugin\struct\meta\ConfigParser; 130699ff47SMichael Grosseuse dokuwiki\plugin\struct\meta\SearchCloud; 14fa04b28cSMichael Grosseuse dokuwiki\plugin\struct\meta\StructException; 15fa04b28cSMichael Grosse 16*7234bfb1Ssplitbrainclass syntax_plugin_struct_cloud extends SyntaxPlugin 17d6d97f60SAnna Dabrowska{ 18fa04b28cSMichael Grosse /** 19fa04b28cSMichael Grosse * @return string Syntax mode type 20fa04b28cSMichael Grosse */ 21d6d97f60SAnna Dabrowska public function getType() 22d6d97f60SAnna Dabrowska { 23fa04b28cSMichael Grosse return 'substition'; 24fa04b28cSMichael Grosse } 250549dcc5SAndreas Gohr 26fa04b28cSMichael Grosse /** 27fa04b28cSMichael Grosse * @return string Paragraph type 28fa04b28cSMichael Grosse */ 29d6d97f60SAnna Dabrowska public function getPType() 30d6d97f60SAnna Dabrowska { 31fa04b28cSMichael Grosse return 'block'; 32fa04b28cSMichael Grosse } 330549dcc5SAndreas Gohr 34fa04b28cSMichael Grosse /** 35fa04b28cSMichael Grosse * @return int Sort order - Low numbers go before high numbers 36fa04b28cSMichael Grosse */ 37d6d97f60SAnna Dabrowska public function getSort() 38d6d97f60SAnna Dabrowska { 39fa04b28cSMichael Grosse return 151; 40fa04b28cSMichael Grosse } 41fa04b28cSMichael Grosse 42fa04b28cSMichael Grosse /** 43fa04b28cSMichael Grosse * Connect lookup pattern to lexer. 44fa04b28cSMichael Grosse * 45fa04b28cSMichael Grosse * @param string $mode Parser mode 46fa04b28cSMichael Grosse */ 47d6d97f60SAnna Dabrowska public function connectTo($mode) 48d6d97f60SAnna Dabrowska { 49fa04b28cSMichael Grosse $this->Lexer->addSpecialPattern('----+ *struct cloud *-+\n.*?\n----+', $mode, 'plugin_struct_cloud'); 50fa04b28cSMichael Grosse } 51fa04b28cSMichael Grosse 52fa04b28cSMichael Grosse /** 53fa04b28cSMichael Grosse * Handle matches of the struct syntax 54fa04b28cSMichael Grosse * 55fa04b28cSMichael Grosse * @param string $match The match of the syntax 56fa04b28cSMichael Grosse * @param int $state The state of the handler 57fa04b28cSMichael Grosse * @param int $pos The position in the document 58fa04b28cSMichael Grosse * @param Doku_Handler $handler The handler 59fa04b28cSMichael Grosse * @return array Data for the renderer 60fa04b28cSMichael Grosse */ 61d6d97f60SAnna Dabrowska public function handle($match, $state, $pos, Doku_Handler $handler) 62d6d97f60SAnna Dabrowska { 63fa04b28cSMichael Grosse global $conf; 64fa04b28cSMichael Grosse $lines = explode("\n", $match); 65fa04b28cSMichael Grosse array_shift($lines); 66fa04b28cSMichael Grosse array_pop($lines); 67b3e6d4a4SMichael Grosse 68fa04b28cSMichael Grosse try { 69fa04b28cSMichael Grosse $parser = new ConfigParser($lines); 70fa04b28cSMichael Grosse $config = $parser->getConfig(); 71fa04b28cSMichael Grosse return $config; 72fa04b28cSMichael Grosse } catch (StructException $e) { 73fa04b28cSMichael Grosse msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 74fa04b28cSMichael Grosse if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 75fa04b28cSMichael Grosse return null; 76fa04b28cSMichael Grosse } 77fa04b28cSMichael Grosse } 78fa04b28cSMichael Grosse 79fa04b28cSMichael Grosse /** 80fa04b28cSMichael Grosse * Render xhtml output or metadata 81fa04b28cSMichael Grosse * 82fa04b28cSMichael Grosse * @param string $mode Renderer mode (supported modes: xhtml) 83fa04b28cSMichael Grosse * @param Doku_Renderer $renderer The renderer 84fa04b28cSMichael Grosse * @param array $data The data from the handler() function 85fa04b28cSMichael Grosse * @return bool If rendering was successful. 86fa04b28cSMichael Grosse */ 87d6d97f60SAnna Dabrowska public function render($mode, Doku_Renderer $renderer, $data) 88d6d97f60SAnna Dabrowska { 89fa04b28cSMichael Grosse if ($mode != 'xhtml') return false; 90fa04b28cSMichael Grosse if (!$data) return false; 91fa04b28cSMichael Grosse global $INFO, $conf; 92fa04b28cSMichael Grosse try { 930699ff47SMichael Grosse $search = new SearchCloud($data); 948026d0b1SMichael Grosse $cloud = new AggregationCloud($INFO['id'], $mode, $renderer, $search); 95af0ce8d2SAndreas Gohr $cloud->startScope(); 968026d0b1SMichael Grosse $cloud->render(); 97af0ce8d2SAndreas Gohr $cloud->finishScope(); 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