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; 130699ff47SMichael 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 { 18*8026d0b1SMichael Grosse 19fa04b28cSMichael Grosse /** 20fa04b28cSMichael Grosse * @return string Syntax mode type 21fa04b28cSMichael Grosse */ 22fa04b28cSMichael Grosse public function getType() { 23fa04b28cSMichael Grosse return 'substition'; 24fa04b28cSMichael Grosse } 25fa04b28cSMichael Grosse /** 26fa04b28cSMichael Grosse * @return string Paragraph type 27fa04b28cSMichael Grosse */ 28fa04b28cSMichael Grosse public function getPType() { 29fa04b28cSMichael Grosse return 'block'; 30fa04b28cSMichael Grosse } 31fa04b28cSMichael Grosse /** 32fa04b28cSMichael Grosse * @return int Sort order - Low numbers go before high numbers 33fa04b28cSMichael Grosse */ 34fa04b28cSMichael Grosse public function getSort() { 35fa04b28cSMichael Grosse return 151; 36fa04b28cSMichael Grosse } 37fa04b28cSMichael Grosse 38fa04b28cSMichael Grosse /** 39fa04b28cSMichael Grosse * Connect lookup pattern to lexer. 40fa04b28cSMichael Grosse * 41fa04b28cSMichael Grosse * @param string $mode Parser mode 42fa04b28cSMichael Grosse */ 43fa04b28cSMichael Grosse public function connectTo($mode) { 44fa04b28cSMichael Grosse $this->Lexer->addSpecialPattern('----+ *struct cloud *-+\n.*?\n----+',$mode,'plugin_struct_cloud'); 45fa04b28cSMichael Grosse } 46fa04b28cSMichael Grosse 47fa04b28cSMichael Grosse /** 48fa04b28cSMichael Grosse * Handle matches of the struct syntax 49fa04b28cSMichael Grosse * 50fa04b28cSMichael Grosse * @param string $match The match of the syntax 51fa04b28cSMichael Grosse * @param int $state The state of the handler 52fa04b28cSMichael Grosse * @param int $pos The position in the document 53fa04b28cSMichael Grosse * @param Doku_Handler $handler The handler 54fa04b28cSMichael Grosse * @return array Data for the renderer 55fa04b28cSMichael Grosse */ 56fa04b28cSMichael Grosse public function handle($match, $state, $pos, Doku_Handler $handler){ 57fa04b28cSMichael Grosse global $conf; 58fa04b28cSMichael Grosse $lines = explode("\n", $match); 59fa04b28cSMichael Grosse array_shift($lines); 60fa04b28cSMichael Grosse array_pop($lines); 61fa04b28cSMichael Grosse // todo: disallow dynfilters, rownumbers, limit, offset, ... 62fa04b28cSMichael Grosse try { 63fa04b28cSMichael Grosse $parser = new ConfigParser($lines); 64fa04b28cSMichael Grosse $config = $parser->getConfig(); 65fa04b28cSMichael Grosse return $config; 66fa04b28cSMichael Grosse } catch(StructException $e) { 67fa04b28cSMichael Grosse msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 68fa04b28cSMichael Grosse if($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 69fa04b28cSMichael Grosse return null; 70fa04b28cSMichael Grosse } 71fa04b28cSMichael Grosse 72fa04b28cSMichael Grosse } 73fa04b28cSMichael Grosse 74fa04b28cSMichael Grosse /** 75fa04b28cSMichael Grosse * Render xhtml output or metadata 76fa04b28cSMichael Grosse * 77fa04b28cSMichael Grosse * @param string $mode Renderer mode (supported modes: xhtml) 78fa04b28cSMichael Grosse * @param Doku_Renderer $renderer The renderer 79fa04b28cSMichael Grosse * @param array $data The data from the handler() function 80fa04b28cSMichael Grosse * @return bool If rendering was successful. 81fa04b28cSMichael Grosse */ 82fa04b28cSMichael Grosse public function render($mode, Doku_Renderer $renderer, $data) { 83fa04b28cSMichael Grosse if($mode != 'xhtml') return false; 84fa04b28cSMichael Grosse if(!$data) return false; 85fa04b28cSMichael Grosse global $INFO, $conf; 86fa04b28cSMichael Grosse try { 870699ff47SMichael Grosse $search = new SearchCloud($data); 88*8026d0b1SMichael Grosse $cloud = new AggregationCloud($INFO['id'], $mode, $renderer, $search); 89*8026d0b1SMichael Grosse $cloud->render(); 90fa04b28cSMichael Grosse if($mode == 'metadata') { 91fa04b28cSMichael Grosse /** @var Doku_Renderer_metadata $renderer */ 92fa04b28cSMichael Grosse $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag(); 93fa04b28cSMichael Grosse } 94fa04b28cSMichael Grosse } catch(StructException $e) { 95fa04b28cSMichael Grosse msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 96fa04b28cSMichael Grosse if($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 97fa04b28cSMichael Grosse } 98fa04b28cSMichael Grosse 99fa04b28cSMichael Grosse return true; 100fa04b28cSMichael Grosse } 101fa04b28cSMichael Grosse} 102fa04b28cSMichael Grosse 103fa04b28cSMichael Grosse// vim:ts=4:sw=4:et: 104