1*812a20f7SIain Hallam<?php 2*812a20f7SIain Hallam/** 3*812a20f7SIain Hallam * DokuWiki Plugin struct (Syntax Component) 4*812a20f7SIain Hallam * 5*812a20f7SIain Hallam * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6*812a20f7SIain Hallam * @author Iain Hallam <iain@nineworlds.net> 7*812a20f7SIain Hallam */ 8*812a20f7SIain Hallam 9*812a20f7SIain Hallam// phpcs:disable PSR1.Files.SideEffects 10*812a20f7SIain Hallam 11*812a20f7SIain Hallamuse dokuwiki\plugin\struct\meta\AggregationValue; 12*812a20f7SIain Hallamuse dokuwiki\plugin\struct\meta\ConfigParser; 13*812a20f7SIain Hallamuse dokuwiki\plugin\struct\meta\InlineConfigParser; 14*812a20f7SIain Hallamuse dokuwiki\plugin\struct\meta\SearchConfig; 15*812a20f7SIain Hallamuse dokuwiki\plugin\struct\meta\StructException; 16*812a20f7SIain Hallam 17*812a20f7SIain Hallam// must be run within Dokuwiki 18*812a20f7SIain Hallamif (!defined('DOKU_INC')) { 19*812a20f7SIain Hallam die(); 20*812a20f7SIain Hallam} 21*812a20f7SIain Hallam 22*812a20f7SIain Hallam// phpcs:ignore PSR1.Classes.ClassDeclaration, Squiz.Classes.ValidClassName 23*812a20f7SIain Hallamclass syntax_plugin_struct_value extends DokuWiki_Syntax_Plugin 24*812a20f7SIain Hallam{ 25*812a20f7SIain Hallam 26*812a20f7SIain Hallam /** 27*812a20f7SIain Hallam * @return string Syntax mode type 28*812a20f7SIain Hallam */ 29*812a20f7SIain Hallam public function getType() 30*812a20f7SIain Hallam { 31*812a20f7SIain Hallam return 'substition'; 32*812a20f7SIain Hallam } 33*812a20f7SIain Hallam 34*812a20f7SIain Hallam /** 35*812a20f7SIain Hallam * @return int Sort order - Low numbers go before high numbers 36*812a20f7SIain Hallam */ 37*812a20f7SIain Hallam public function getSort() 38*812a20f7SIain Hallam { 39*812a20f7SIain Hallam /* 315 to place above Doku_Parser_Mode_media, which would 40*812a20f7SIain Hallam * otherwise take precedence. See 41*812a20f7SIain Hallam * https://www.dokuwiki.org/devel:parser:getsort_list 42*812a20f7SIain Hallam */ 43*812a20f7SIain Hallam return 315; 44*812a20f7SIain Hallam } 45*812a20f7SIain Hallam 46*812a20f7SIain Hallam /** 47*812a20f7SIain Hallam * Connect lookup pattern to lexer. 48*812a20f7SIain Hallam * 49*812a20f7SIain Hallam * @param string $mode Parser mode 50*812a20f7SIain Hallam */ 51*812a20f7SIain Hallam public function connectTo($mode) 52*812a20f7SIain Hallam { 53*812a20f7SIain Hallam // {{$...}} 54*812a20f7SIain Hallam $this->Lexer->addSpecialPattern('\{\{\$[^}]+\}\}', $mode, 'plugin_struct_value'); 55*812a20f7SIain Hallam } 56*812a20f7SIain Hallam 57*812a20f7SIain Hallam /** 58*812a20f7SIain Hallam * Handle matches of the struct syntax 59*812a20f7SIain Hallam * 60*812a20f7SIain Hallam * @param string $match The match of the syntax 61*812a20f7SIain Hallam * @param int $state The state of the handler 62*812a20f7SIain Hallam * @param int $pos The position in the document 63*812a20f7SIain Hallam * @param Doku_Handler $handler The handler 64*812a20f7SIain Hallam * @return array Data for the renderer 65*812a20f7SIain Hallam */ 66*812a20f7SIain Hallam public function handle($match, $state, $pos, Doku_Handler $handler) 67*812a20f7SIain Hallam { 68*812a20f7SIain Hallam global $conf; 69*812a20f7SIain Hallam 70*812a20f7SIain Hallam try { 71*812a20f7SIain Hallam // strip {{$ and }} markers 72*812a20f7SIain Hallam $inline = substr($match, 3, -2); 73*812a20f7SIain Hallam 74*812a20f7SIain Hallam // Parse inline syntax 75*812a20f7SIain Hallam $parser = new InlineConfigParser($inline); 76*812a20f7SIain Hallam $config = $parser->getConfig(); 77*812a20f7SIain Hallam 78*812a20f7SIain Hallam return $config; 79*812a20f7SIain Hallam } catch (StructException $e) { 80*812a20f7SIain Hallam msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 81*812a20f7SIain Hallam if ($conf['allowdebug']) { 82*812a20f7SIain Hallam msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 83*812a20f7SIain Hallam } 84*812a20f7SIain Hallam return null; 85*812a20f7SIain Hallam } 86*812a20f7SIain Hallam } 87*812a20f7SIain Hallam 88*812a20f7SIain Hallam /** 89*812a20f7SIain Hallam * Render xhtml output or metadata 90*812a20f7SIain Hallam * 91*812a20f7SIain Hallam * @param string $mode Renderer mode (supported modes: xhtml) 92*812a20f7SIain Hallam * @param Doku_Renderer $renderer The renderer 93*812a20f7SIain Hallam * @param array $data The data from the handler() function 94*812a20f7SIain Hallam * @return bool If rendering was successful. 95*812a20f7SIain Hallam */ 96*812a20f7SIain Hallam public function render($mode, Doku_Renderer $renderer, $data) 97*812a20f7SIain Hallam { 98*812a20f7SIain Hallam if (!$data) { 99*812a20f7SIain Hallam return false; 100*812a20f7SIain Hallam } 101*812a20f7SIain Hallam global $INFO; 102*812a20f7SIain Hallam global $conf; 103*812a20f7SIain Hallam 104*812a20f7SIain Hallam // Get configuration 105*812a20f7SIain Hallam $show_not_found = $this->getConf('show_not_found'); 106*812a20f7SIain Hallam 107*812a20f7SIain Hallam try { 108*812a20f7SIain Hallam /** @var SearchConfig $search */ 109*812a20f7SIain Hallam $search = new SearchConfig($data); 110*812a20f7SIain Hallam 111*812a20f7SIain Hallam /** @var AggregationValue $value */ 112*812a20f7SIain Hallam $value = new AggregationValue($INFO['id'], $mode, $renderer, $search); 113*812a20f7SIain Hallam $value->render($show_not_found); 114*812a20f7SIain Hallam 115*812a20f7SIain Hallam if ($mode == 'metadata') { 116*812a20f7SIain Hallam /** @var Doku_Renderer_metadata $renderer */ 117*812a20f7SIain Hallam $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag(); 118*812a20f7SIain Hallam } 119*812a20f7SIain Hallam } catch (StructException $e) { 120*812a20f7SIain Hallam msg($e->getMessage(), -1, $e->getLine(), $e->getFile()); 121*812a20f7SIain Hallam if ($conf['allowdebug']) { 122*812a20f7SIain Hallam msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1); 123*812a20f7SIain Hallam } 124*812a20f7SIain Hallam } 125*812a20f7SIain Hallam 126*812a20f7SIain Hallam return true; 127*812a20f7SIain Hallam } 128*812a20f7SIain Hallam} 129