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