xref: /plugin/struct/syntax/value.php (revision 812a20f76a42af454ce9b827bf7c930f0774879f)
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