xref: /plugin/struct/syntax/value.php (revision 95507c0866d33f6f83fb8973e5ee75ed8f51e6c6)
1812a20f7SIain Hallam<?php
2*95507c08SAnna 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
11812a20f7SIain Hallam
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
18812a20f7SIain Hallamclass syntax_plugin_struct_value extends DokuWiki_Syntax_Plugin
19812a20f7SIain Hallam{
20812a20f7SIain Hallam
21812a20f7SIain Hallam    /**
22812a20f7SIain Hallam     * @return string Syntax mode type
23812a20f7SIain Hallam     */
24812a20f7SIain Hallam    public function getType()
25812a20f7SIain Hallam    {
26812a20f7SIain Hallam        return 'substition';
27812a20f7SIain Hallam    }
28812a20f7SIain Hallam
29812a20f7SIain Hallam    /**
30812a20f7SIain Hallam     * @return int Sort order - Low numbers go before high numbers
31812a20f7SIain Hallam     */
32812a20f7SIain Hallam    public function getSort()
33812a20f7SIain Hallam    {
34812a20f7SIain Hallam        /* 315 to place above Doku_Parser_Mode_media, which would
35812a20f7SIain Hallam         * otherwise take precedence. See
36812a20f7SIain Hallam         * https://www.dokuwiki.org/devel:parser:getsort_list
37812a20f7SIain Hallam         */
38812a20f7SIain Hallam        return 315;
39812a20f7SIain Hallam    }
40812a20f7SIain Hallam
41812a20f7SIain Hallam    /**
42812a20f7SIain Hallam     * Connect lookup pattern to lexer.
43812a20f7SIain Hallam     *
44812a20f7SIain Hallam     * @param string $mode Parser mode
45812a20f7SIain Hallam     */
46812a20f7SIain Hallam    public function connectTo($mode)
47812a20f7SIain Hallam    {
48812a20f7SIain Hallam        // {{$...}}
49812a20f7SIain Hallam        $this->Lexer->addSpecialPattern('\{\{\$[^}]+\}\}', $mode, 'plugin_struct_value');
50812a20f7SIain Hallam    }
51812a20f7SIain Hallam
52812a20f7SIain Hallam    /**
53812a20f7SIain Hallam     * Handle matches of the struct syntax
54812a20f7SIain Hallam     *
55812a20f7SIain Hallam     * @param   string        $match    The match of the syntax
56812a20f7SIain Hallam     * @param   int           $state    The state of the handler
57812a20f7SIain Hallam     * @param   int           $pos      The position in the document
58812a20f7SIain Hallam     * @param   Doku_Handler  $handler  The handler
59812a20f7SIain Hallam     * @return  array                   Data for the renderer
60812a20f7SIain Hallam     */
61812a20f7SIain Hallam    public function handle($match, $state, $pos, Doku_Handler $handler)
62812a20f7SIain Hallam    {
63812a20f7SIain Hallam        global $conf;
64812a20f7SIain Hallam
65812a20f7SIain Hallam        try {
66812a20f7SIain Hallam            // strip {{$ and }} markers
67812a20f7SIain Hallam            $inline = substr($match, 3, -2);
68812a20f7SIain Hallam
69812a20f7SIain Hallam            // Parse inline syntax
70812a20f7SIain Hallam            $parser = new InlineConfigParser($inline);
71812a20f7SIain Hallam            $config = $parser->getConfig();
72812a20f7SIain Hallam
73812a20f7SIain Hallam            return $config;
74812a20f7SIain Hallam        } catch (StructException $e) {
75812a20f7SIain Hallam            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
76812a20f7SIain Hallam            if ($conf['allowdebug']) {
77812a20f7SIain Hallam                msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
78812a20f7SIain Hallam            }
79812a20f7SIain Hallam            return null;
80812a20f7SIain Hallam        }
81812a20f7SIain Hallam    }
82812a20f7SIain Hallam
83812a20f7SIain Hallam    /**
84812a20f7SIain Hallam     * Render xhtml output or metadata
85812a20f7SIain Hallam     *
86812a20f7SIain Hallam     * @param   string         $mode      Renderer mode (supported modes: xhtml)
87812a20f7SIain Hallam     * @param   Doku_Renderer  $renderer  The renderer
88812a20f7SIain Hallam     * @param   array          $data      The data from the handler() function
89812a20f7SIain Hallam     * @return  bool                      If rendering was successful.
90812a20f7SIain Hallam     */
91812a20f7SIain Hallam    public function render($mode, Doku_Renderer $renderer, $data)
92812a20f7SIain Hallam    {
93812a20f7SIain Hallam        if (!$data) {
94812a20f7SIain Hallam            return false;
95812a20f7SIain Hallam        }
96812a20f7SIain Hallam        global $INFO;
97812a20f7SIain Hallam        global $conf;
98812a20f7SIain Hallam
99812a20f7SIain Hallam        // Get configuration
100812a20f7SIain Hallam        $show_not_found = $this->getConf('show_not_found');
101812a20f7SIain Hallam
102812a20f7SIain Hallam        try {
103812a20f7SIain Hallam            /** @var SearchConfig $search */
104812a20f7SIain Hallam            $search = new SearchConfig($data);
105812a20f7SIain Hallam
106812a20f7SIain Hallam            /** @var AggregationValue $value */
107812a20f7SIain Hallam            $value = new AggregationValue($INFO['id'], $mode, $renderer, $search);
108812a20f7SIain Hallam            $value->render($show_not_found);
109812a20f7SIain Hallam
110812a20f7SIain Hallam            if ($mode == 'metadata') {
111812a20f7SIain Hallam                /** @var Doku_Renderer_metadata $renderer */
112812a20f7SIain Hallam                $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag();
113812a20f7SIain Hallam            }
114812a20f7SIain Hallam        } catch (StructException $e) {
115812a20f7SIain Hallam            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
116812a20f7SIain Hallam            if ($conf['allowdebug']) {
117812a20f7SIain Hallam                msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
118812a20f7SIain Hallam            }
119812a20f7SIain Hallam        }
120812a20f7SIain Hallam
121812a20f7SIain Hallam        return true;
122812a20f7SIain Hallam    }
123812a20f7SIain Hallam}
124