1812a20f7SIain Hallam<?php 295507c08SAnna Dabrowska 3812a20f7SIain Hallam/** 4812a20f7SIain Hallam * DokuWiki Plugin struct (Syntax Component) 5812a20f7SIain Hallam * 6812a20f7SIain Hallam * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 7812a20f7SIain Hallam * @author Iain Hallam <iain@nineworlds.net> 8812a20f7SIain Hallam */ 9812a20f7SIain Hallam 10812a20f7SIain Hallam// phpcs:disable PSR1.Files.SideEffects 11*7234bfb1Ssplitbrainuse dokuwiki\Extension\SyntaxPlugin; 12812a20f7SIain Hallamuse dokuwiki\plugin\struct\meta\AggregationValue; 13812a20f7SIain Hallamuse dokuwiki\plugin\struct\meta\InlineConfigParser; 14812a20f7SIain Hallamuse dokuwiki\plugin\struct\meta\SearchConfig; 15812a20f7SIain Hallamuse dokuwiki\plugin\struct\meta\StructException; 16812a20f7SIain Hallam 17812a20f7SIain Hallam// phpcs:ignore PSR1.Classes.ClassDeclaration, Squiz.Classes.ValidClassName 18*7234bfb1Ssplitbrainclass syntax_plugin_struct_value extends SyntaxPlugin 19812a20f7SIain Hallam{ 20812a20f7SIain Hallam /** 21812a20f7SIain Hallam * @return string Syntax mode type 22812a20f7SIain Hallam */ 23812a20f7SIain Hallam public function getType() 24812a20f7SIain Hallam { 25812a20f7SIain Hallam return 'substition'; 26812a20f7SIain Hallam } 27812a20f7SIain Hallam 28812a20f7SIain Hallam /** 29812a20f7SIain Hallam * @return int Sort order - Low numbers go before high numbers 30812a20f7SIain Hallam */ 31812a20f7SIain Hallam public function getSort() 32812a20f7SIain Hallam { 33812a20f7SIain Hallam /* 315 to place above Doku_Parser_Mode_media, which would 34812a20f7SIain Hallam * otherwise take precedence. See 35812a20f7SIain Hallam * https://www.dokuwiki.org/devel:parser:getsort_list 36812a20f7SIain Hallam */ 37812a20f7SIain Hallam return 315; 38812a20f7SIain Hallam } 39812a20f7SIain Hallam 40812a20f7SIain Hallam /** 41812a20f7SIain Hallam * Connect lookup pattern to lexer. 42812a20f7SIain Hallam * 43812a20f7SIain Hallam * @param string $mode Parser mode 44812a20f7SIain Hallam */ 45812a20f7SIain Hallam public function connectTo($mode) 46812a20f7SIain Hallam { 47812a20f7SIain Hallam // {{$...}} 48812a20f7SIain Hallam $this->Lexer->addSpecialPattern('\{\{\$[^}]+\}\}', $mode, 'plugin_struct_value'); 49812a20f7SIain Hallam } 50812a20f7SIain Hallam 51812a20f7SIain Hallam /** 52812a20f7SIain Hallam * Handle matches of the struct syntax 53812a20f7SIain Hallam * 54812a20f7SIain Hallam * @param string $match The match of the syntax 55812a20f7SIain Hallam * @param int $state The state of the handler 56812a20f7SIain Hallam * @param int $pos The position in the document 57812a20f7SIain Hallam * @param Doku_Handler $handler The handler 58812a20f7SIain Hallam * @return array Data for the renderer 59812a20f7SIain Hallam */ 60812a20f7SIain Hallam public function handle($match, $state, $pos, Doku_Handler $handler) 61812a20f7SIain Hallam { 62812a20f7SIain Hallam global $conf; 63812a20f7SIain Hallam 64812a20f7SIain Hallam try { 65812a20f7SIain Hallam // strip {{$ and }} markers 66812a20f7SIain Hallam $inline = substr($match, 3, -2); 67812a20f7SIain Hallam 68812a20f7SIain Hallam // Parse inline syntax 69812a20f7SIain Hallam $parser = new InlineConfigParser($inline); 70812a20f7SIain Hallam $config = $parser->getConfig(); 71812a20f7SIain Hallam 72812a20f7SIain Hallam return $config; 73812a20f7SIain Hallam } catch (StructException $e) { 74812a20f7SIain Hallam msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 75812a20f7SIain Hallam if ($conf['allowdebug']) { 76812a20f7SIain Hallam msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 77812a20f7SIain Hallam } 78812a20f7SIain Hallam return null; 79812a20f7SIain Hallam } 80812a20f7SIain Hallam } 81812a20f7SIain Hallam 82812a20f7SIain Hallam /** 83812a20f7SIain Hallam * Render xhtml output or metadata 84812a20f7SIain Hallam * 85812a20f7SIain Hallam * @param string $mode Renderer mode (supported modes: xhtml) 86812a20f7SIain Hallam * @param Doku_Renderer $renderer The renderer 87812a20f7SIain Hallam * @param array $data The data from the handler() function 88812a20f7SIain Hallam * @return bool If rendering was successful. 89812a20f7SIain Hallam */ 90812a20f7SIain Hallam public function render($mode, Doku_Renderer $renderer, $data) 91812a20f7SIain Hallam { 92812a20f7SIain Hallam if (!$data) { 93812a20f7SIain Hallam return false; 94812a20f7SIain Hallam } 95812a20f7SIain Hallam global $INFO; 96812a20f7SIain Hallam global $conf; 97812a20f7SIain Hallam 98812a20f7SIain Hallam // Get configuration 99812a20f7SIain Hallam $show_not_found = $this->getConf('show_not_found'); 100812a20f7SIain Hallam 101812a20f7SIain Hallam try { 102812a20f7SIain Hallam /** @var SearchConfig $search */ 103812a20f7SIain Hallam $search = new SearchConfig($data); 104812a20f7SIain Hallam 105812a20f7SIain Hallam /** @var AggregationValue $value */ 106812a20f7SIain Hallam $value = new AggregationValue($INFO['id'], $mode, $renderer, $search); 107af0ce8d2SAndreas Gohr $value->startScope(); 108812a20f7SIain Hallam $value->render($show_not_found); 109af0ce8d2SAndreas Gohr $value->finishScope(); 110812a20f7SIain Hallam 111812a20f7SIain Hallam if ($mode == 'metadata') { 112812a20f7SIain Hallam /** @var Doku_Renderer_metadata $renderer */ 113812a20f7SIain Hallam $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag(); 114812a20f7SIain Hallam } 115812a20f7SIain Hallam } catch (StructException $e) { 116812a20f7SIain Hallam msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 117812a20f7SIain Hallam if ($conf['allowdebug']) { 118812a20f7SIain Hallam msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 119812a20f7SIain Hallam } 120812a20f7SIain Hallam } 121812a20f7SIain Hallam 122812a20f7SIain Hallam return true; 123812a20f7SIain Hallam } 124812a20f7SIain Hallam} 125