xref: /dokuwiki/lib/plugins/info/syntax.php (revision 093fe67e98c0cdb4b73fd46938e49b64971483c2)
1f62ea8a1Sandi<?php
245a30e7cSAndreas Gohr
38553d24dSAndreas Gohruse dokuwiki\Extension\SyntaxPlugin;
454cc7aa4SAndreas Gohruse dokuwiki\Extension\PluginInterface;
5d4f83172SAndreas Gohr
6f62ea8a1Sandi/**
7f62ea8a1Sandi * Info Plugin: Displays information about various DokuWiki internals
8f62ea8a1Sandi *
9f62ea8a1Sandi * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
10f62ea8a1Sandi * @author     Andreas Gohr <andi@splitbrain.org>
11c06c1c7aSEsther Brunner * @author     Esther Brunner <wikidesign@gmail.com>
12f62ea8a1Sandi */
138553d24dSAndreas Gohrclass syntax_plugin_info extends SyntaxPlugin
14957f36a6SAndreas Gohr{
15f62ea8a1Sandi    /**
16f62ea8a1Sandi     * What kind of syntax are we?
17f62ea8a1Sandi     */
18957f36a6SAndreas Gohr    public function getType()
19957f36a6SAndreas Gohr    {
20f62ea8a1Sandi        return 'substition';
21f62ea8a1Sandi    }
22f62ea8a1Sandi
23f62ea8a1Sandi    /**
24896a5c22Sandi     * What about paragraphs?
25896a5c22Sandi     */
26957f36a6SAndreas Gohr    public function getPType()
27957f36a6SAndreas Gohr    {
28896a5c22Sandi        return 'block';
29896a5c22Sandi    }
30896a5c22Sandi
31896a5c22Sandi    /**
32f62ea8a1Sandi     * Where to sort in?
33f62ea8a1Sandi     */
34957f36a6SAndreas Gohr    public function getSort()
35957f36a6SAndreas Gohr    {
36f62ea8a1Sandi        return 155;
37f62ea8a1Sandi    }
38f62ea8a1Sandi
39f62ea8a1Sandi    /**
40f62ea8a1Sandi     * Connect pattern to lexer
41f62ea8a1Sandi     */
42957f36a6SAndreas Gohr    public function connectTo($mode)
43957f36a6SAndreas Gohr    {
44f62ea8a1Sandi        $this->Lexer->addSpecialPattern('~~INFO:\w+~~', $mode, 'plugin_info');
45f62ea8a1Sandi    }
46f62ea8a1Sandi
47f62ea8a1Sandi    /**
48f62ea8a1Sandi     * Handle the match
49253d4b48SGerrit Uitslag     *
50253d4b48SGerrit Uitslag     * @param string $match The text matched by the patterns
51253d4b48SGerrit Uitslag     * @param int $state The lexer state for the match
52253d4b48SGerrit Uitslag     * @param int $pos The character position of the matched text
53253d4b48SGerrit Uitslag     * @param Doku_Handler $handler The Doku_Handler object
54253d4b48SGerrit Uitslag     * @return  array Return an array with all data you want to use in render
55f62ea8a1Sandi     */
56957f36a6SAndreas Gohr    public function handle($match, $state, $pos, Doku_Handler $handler)
57957f36a6SAndreas Gohr    {
58f62ea8a1Sandi        $match = substr($match, 7, -2); //strip ~~INFO: from start and ~~ from end
5954cc7aa4SAndreas Gohr        return [strtolower($match)];
60f62ea8a1Sandi    }
61f62ea8a1Sandi
62f62ea8a1Sandi    /**
63f62ea8a1Sandi     * Create output
64253d4b48SGerrit Uitslag     *
65253d4b48SGerrit Uitslag     * @param string $format string     output format being rendered
66253d4b48SGerrit Uitslag     * @param Doku_Renderer $renderer the current renderer object
67253d4b48SGerrit Uitslag     * @param array $data data created by handler()
68253d4b48SGerrit Uitslag     * @return  boolean                 rendered correctly?
69f62ea8a1Sandi     */
70957f36a6SAndreas Gohr    public function render($format, Doku_Renderer $renderer, $data)
71957f36a6SAndreas Gohr    {
72f4e5a570Schris        if ($format == 'xhtml') {
7374ed54d4SGerrit Uitslag            /** @var Doku_Renderer_xhtml $renderer */
74f62ea8a1Sandi            //handle various info stuff
75*093fe67eSAndreas Gohr            match ($data[0]) {
76*093fe67eSAndreas Gohr                'syntaxmodes' => $renderer->doc .= $this->renderSyntaxModes(),
77*093fe67eSAndreas Gohr                'syntaxtypes' => $renderer->doc .= $this->renderSyntaxTypes(),
78*093fe67eSAndreas Gohr                'syntaxplugins' => $this->renderPlugins('syntax', $renderer),
79*093fe67eSAndreas Gohr                'adminplugins' => $this->renderPlugins('admin', $renderer),
80*093fe67eSAndreas Gohr                'actionplugins' => $this->renderPlugins('action', $renderer),
81*093fe67eSAndreas Gohr                'rendererplugins' => $this->renderPlugins('renderer', $renderer),
82*093fe67eSAndreas Gohr                'helperplugins' => $this->renderPlugins('helper', $renderer),
83*093fe67eSAndreas Gohr                'authplugins' => $this->renderPlugins('auth', $renderer),
84*093fe67eSAndreas Gohr                'remoteplugins' => $this->renderPlugins('remote', $renderer),
85*093fe67eSAndreas Gohr                'helpermethods' => $this->renderHelperMethods($renderer),
86*093fe67eSAndreas Gohr                'hooks' => $this->renderHooks($renderer),
87*093fe67eSAndreas Gohr                'datetime' => $renderer->doc .= date('r'),
88*093fe67eSAndreas Gohr                default => $renderer->doc .= "no info about " . htmlspecialchars($data[0]),
89*093fe67eSAndreas Gohr            };
90f62ea8a1Sandi            return true;
91f62ea8a1Sandi        }
92f62ea8a1Sandi        return false;
93f62ea8a1Sandi    }
94f62ea8a1Sandi
95f62ea8a1Sandi    /**
96c06c1c7aSEsther Brunner     * list all installed plugins
97896a5c22Sandi     *
98896a5c22Sandi     * uses some of the original renderer methods
99253d4b48SGerrit Uitslag     *
100253d4b48SGerrit Uitslag     * @param string $type
1014baa5c86SAndreas Gohr     * @param Doku_Renderer $renderer
102896a5c22Sandi     */
1034baa5c86SAndreas Gohr    protected function renderPlugins($type, Doku_Renderer $renderer)
104957f36a6SAndreas Gohr    {
105896a5c22Sandi        global $lang;
106c06c1c7aSEsther Brunner        $plugins = plugin_list($type);
10754cc7aa4SAndreas Gohr        $plginfo = [];
1085f5f3ddcSAndreas Gohr
1095f5f3ddcSAndreas Gohr        // remove subparts
110896a5c22Sandi        foreach ($plugins as $p) {
11154cc7aa4SAndreas Gohr            $po = plugin_load($type, $p);
11254cc7aa4SAndreas Gohr            if (! $po instanceof PluginInterface) continue;
113a19c9aa0SGerrit Uitslag            [$name, /* part */] = explode('_', $p, 2);
1145f5f3ddcSAndreas Gohr            $plginfo[$name] = $po->getInfo();
1155f5f3ddcSAndreas Gohr        }
116896a5c22Sandi
1175f5f3ddcSAndreas Gohr        // list them
1184baa5c86SAndreas Gohr        $renderer->listu_open();
1195f5f3ddcSAndreas Gohr        foreach ($plginfo as $info) {
1204baa5c86SAndreas Gohr            $renderer->listitem_open(1);
1214baa5c86SAndreas Gohr            $renderer->listcontent_open();
122896a5c22Sandi            $renderer->externallink($info['url'], $info['name']);
1234baa5c86SAndreas Gohr            $renderer->cdata(' ');
1244baa5c86SAndreas Gohr            $renderer->emphasis_open();
1254baa5c86SAndreas Gohr            $renderer->cdata($info['date']);
1264baa5c86SAndreas Gohr            $renderer->emphasis_close();
1274baa5c86SAndreas Gohr            $renderer->cdata(' ' . $lang['by'] . ' ');
128896a5c22Sandi            $renderer->emaillink($info['email'], $info['author']);
1294baa5c86SAndreas Gohr            $renderer->linebreak();
1304baa5c86SAndreas Gohr            $renderer->cdata($info['desc']);
1314baa5c86SAndreas Gohr            $renderer->listcontent_close();
1324baa5c86SAndreas Gohr            $renderer->listitem_close();
133896a5c22Sandi        }
1344baa5c86SAndreas Gohr        $renderer->listu_close();
135896a5c22Sandi    }
136896a5c22Sandi
137896a5c22Sandi    /**
138c06c1c7aSEsther Brunner     * list all installed plugins
139c06c1c7aSEsther Brunner     *
140c06c1c7aSEsther Brunner     * uses some of the original renderer methods
141253d4b48SGerrit Uitslag     *
142253d4b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
143c06c1c7aSEsther Brunner     */
144957f36a6SAndreas Gohr    protected function renderHelperMethods(Doku_Renderer_xhtml $renderer)
145957f36a6SAndreas Gohr    {
146c06c1c7aSEsther Brunner        $plugins = plugin_list('helper');
147c06c1c7aSEsther Brunner        foreach ($plugins as $p) {
14854cc7aa4SAndreas Gohr            $po = plugin_load('helper', $p);
14954cc7aa4SAndreas Gohr            if (!$po instanceof PluginInterface) continue;
150c06c1c7aSEsther Brunner
151c06c1c7aSEsther Brunner            if (!method_exists($po, 'getMethods')) continue;
152c06c1c7aSEsther Brunner            $methods = $po->getMethods();
153c06c1c7aSEsther Brunner            $info = $po->getInfo();
154c06c1c7aSEsther Brunner
155957f36a6SAndreas Gohr            $hid = $this->addToToc($info['name'], 2, $renderer);
156c06c1c7aSEsther Brunner            $doc = '<h2><a name="' . $hid . '" id="' . $hid . '">' . hsc($info['name']) . '</a></h2>';
157c06c1c7aSEsther Brunner            $doc .= '<div class="level2">';
15854cc7aa4SAndreas Gohr            $doc .= '<p>' . strtr(hsc($info['desc']), ["\n" => "<br />"]) . '</p>';
1599b3b9e8eSGerrit Uitslag            $doc .= '<pre class="code">$' . $p . " = plugin_load('helper', '" . $p . "');</pre>";
160c06c1c7aSEsther Brunner            $doc .= '</div>';
161c06c1c7aSEsther Brunner            foreach ($methods as $method) {
162c06c1c7aSEsther Brunner                $title = '$' . $p . '->' . $method['name'] . '()';
163957f36a6SAndreas Gohr                $hid = $this->addToToc($title, 3, $renderer);
164c06c1c7aSEsther Brunner                $doc .= '<h3><a name="' . $hid . '" id="' . $hid . '">' . hsc($title) . '</a></h3>';
165c06c1c7aSEsther Brunner                $doc .= '<div class="level3">';
166c7b28ffdSAnika Henke                $doc .= '<div class="table"><table class="inline"><tbody>';
167c06c1c7aSEsther Brunner                $doc .= '<tr><th>Description</th><td colspan="2">' . $method['desc'] .
168c06c1c7aSEsther Brunner                    '</td></tr>';
169c06c1c7aSEsther Brunner                if ($method['params']) {
170c06c1c7aSEsther Brunner                    $c = count($method['params']);
171c06c1c7aSEsther Brunner                    $doc .= '<tr><th rowspan="' . $c . '">Parameters</th><td>';
17254cc7aa4SAndreas Gohr                    $params = [];
173c06c1c7aSEsther Brunner                    foreach ($method['params'] as $desc => $type) {
174c06c1c7aSEsther Brunner                        $params[] = hsc($desc) . '</td><td>' . hsc($type);
175c06c1c7aSEsther Brunner                    }
17654cc7aa4SAndreas Gohr                    $doc .= implode('</td></tr><tr><td>', $params) . '</td></tr>';
177c06c1c7aSEsther Brunner                }
178c06c1c7aSEsther Brunner                if ($method['return']) {
179c06c1c7aSEsther Brunner                    $doc .= '<tr><th>Return value</th><td>' . hsc(key($method['return'])) .
180c06c1c7aSEsther Brunner                        '</td><td>' . hsc(current($method['return'])) . '</td></tr>';
181c06c1c7aSEsther Brunner                }
182c7b28ffdSAnika Henke                $doc .= '</tbody></table></div>';
183c06c1c7aSEsther Brunner                $doc .= '</div>';
184c06c1c7aSEsther Brunner            }
185c06c1c7aSEsther Brunner            unset($po);
186c06c1c7aSEsther Brunner
187c06c1c7aSEsther Brunner            $renderer->doc .= $doc;
188c06c1c7aSEsther Brunner        }
189c06c1c7aSEsther Brunner    }
190c06c1c7aSEsther Brunner
191c06c1c7aSEsther Brunner    /**
192f62ea8a1Sandi     * lists all known syntax types and their registered modes
193253d4b48SGerrit Uitslag     *
194253d4b48SGerrit Uitslag     * @return string
195f62ea8a1Sandi     */
196957f36a6SAndreas Gohr    protected function renderSyntaxTypes()
197957f36a6SAndreas Gohr    {
198f62ea8a1Sandi        global $PARSER_MODES;
199f62ea8a1Sandi        $doc = '';
200f62ea8a1Sandi
201c7b28ffdSAnika Henke        $doc .= '<div class="table"><table class="inline"><tbody>';
202f62ea8a1Sandi        foreach ($PARSER_MODES as $mode => $modes) {
203f62ea8a1Sandi            $doc .= '<tr>';
204f62ea8a1Sandi            $doc .= '<td class="leftalign">';
205f62ea8a1Sandi            $doc .= $mode;
206f62ea8a1Sandi            $doc .= '</td>';
207f62ea8a1Sandi            $doc .= '<td class="leftalign">';
20854cc7aa4SAndreas Gohr            $doc .= implode(', ', $modes);
209f62ea8a1Sandi            $doc .= '</td>';
210f62ea8a1Sandi            $doc .= '</tr>';
211f62ea8a1Sandi        }
212c7b28ffdSAnika Henke        $doc .= '</tbody></table></div>';
213f62ea8a1Sandi        return $doc;
214f62ea8a1Sandi    }
215f62ea8a1Sandi
216f62ea8a1Sandi    /**
217f62ea8a1Sandi     * lists all known syntax modes and their sorting value
218253d4b48SGerrit Uitslag     *
219253d4b48SGerrit Uitslag     * @return string
220f62ea8a1Sandi     */
221957f36a6SAndreas Gohr    protected function renderSyntaxModes()
222957f36a6SAndreas Gohr    {
223f62ea8a1Sandi        $modes = p_get_parsermodes();
224f62ea8a1Sandi
22554cc7aa4SAndreas Gohr        $compactmodes = [];
226f62ea8a1Sandi        foreach ($modes as $mode) {
227a27c9d6fSGerrit Uitslag            $compactmodes[$mode['sort']][] = $mode['mode'];
228f62ea8a1Sandi        }
229a27c9d6fSGerrit Uitslag        $doc = '';
230a27c9d6fSGerrit Uitslag        $doc .= '<div class="table"><table class="inline"><tbody>';
231a27c9d6fSGerrit Uitslag
232a27c9d6fSGerrit Uitslag        foreach ($compactmodes as $sort => $modes) {
233a27c9d6fSGerrit Uitslag            $rowspan = '';
234a27c9d6fSGerrit Uitslag            if (count($modes) > 1) {
235a27c9d6fSGerrit Uitslag                $rowspan = ' rowspan="' . count($modes) . '"';
236a27c9d6fSGerrit Uitslag            }
237a27c9d6fSGerrit Uitslag
238a27c9d6fSGerrit Uitslag            foreach ($modes as $index => $mode) {
239a27c9d6fSGerrit Uitslag                $doc .= '<tr>';
240a27c9d6fSGerrit Uitslag                $doc .= '<td class="leftalign">';
241a27c9d6fSGerrit Uitslag                $doc .= $mode;
242a27c9d6fSGerrit Uitslag                $doc .= '</td>';
243a27c9d6fSGerrit Uitslag
244a27c9d6fSGerrit Uitslag                if ($index === 0) {
245a27c9d6fSGerrit Uitslag                    $doc .= '<td class="rightalign" ' . $rowspan . '>';
246a27c9d6fSGerrit Uitslag                    $doc .= $sort;
247a27c9d6fSGerrit Uitslag                    $doc .= '</td>';
248a27c9d6fSGerrit Uitslag                }
249a27c9d6fSGerrit Uitslag                $doc .= '</tr>';
250a27c9d6fSGerrit Uitslag            }
251a27c9d6fSGerrit Uitslag        }
252a27c9d6fSGerrit Uitslag
253a27c9d6fSGerrit Uitslag        $doc .= '</tbody></table></div>';
254f62ea8a1Sandi        return $doc;
255f62ea8a1Sandi    }
256c06c1c7aSEsther Brunner
257c06c1c7aSEsther Brunner    /**
258e9ac59e9SAndreas Gohr     * Render all currently registered event handlers
259e9ac59e9SAndreas Gohr     *
260e9ac59e9SAndreas Gohr     * @param Doku_Renderer $renderer
261e9ac59e9SAndreas Gohr     */
262e9ac59e9SAndreas Gohr    protected function renderHooks(Doku_Renderer $renderer)
263e9ac59e9SAndreas Gohr    {
264e9ac59e9SAndreas Gohr        global $EVENT_HANDLER;
265e9ac59e9SAndreas Gohr
266e9ac59e9SAndreas Gohr        $list = $EVENT_HANDLER->getEventHandlers();
267e9ac59e9SAndreas Gohr        ksort($list);
268e9ac59e9SAndreas Gohr
269e9ac59e9SAndreas Gohr        $renderer->listu_open();
270e9ac59e9SAndreas Gohr        foreach ($list as $event => $handlers) {
271e9ac59e9SAndreas Gohr            $renderer->listitem_open(1);
272e9ac59e9SAndreas Gohr            $renderer->listcontent_open();
273e9ac59e9SAndreas Gohr            $renderer->cdata($event);
274e9ac59e9SAndreas Gohr            $renderer->listcontent_close();
275e9ac59e9SAndreas Gohr
276e9ac59e9SAndreas Gohr            $renderer->listo_open();
277e9ac59e9SAndreas Gohr            foreach ($handlers as $sequence) {
278e9ac59e9SAndreas Gohr                foreach ($sequence as $handler) {
279e9ac59e9SAndreas Gohr                    $renderer->listitem_open(2);
280e9ac59e9SAndreas Gohr                    $renderer->listcontent_open();
281*093fe67eSAndreas Gohr                    $renderer->cdata($handler[0]::class . '::' . $handler[1] . '()');
282e9ac59e9SAndreas Gohr                    $renderer->listcontent_close();
283e9ac59e9SAndreas Gohr                    $renderer->listitem_close();
284e9ac59e9SAndreas Gohr                }
285e9ac59e9SAndreas Gohr            }
286e9ac59e9SAndreas Gohr            $renderer->listo_close();
287e9ac59e9SAndreas Gohr            $renderer->listitem_close();
288e9ac59e9SAndreas Gohr        }
289e9ac59e9SAndreas Gohr        $renderer->listu_close();
290e9ac59e9SAndreas Gohr    }
291e9ac59e9SAndreas Gohr
292e9ac59e9SAndreas Gohr    /**
293c06c1c7aSEsther Brunner     * Adds a TOC item
29459bc3b48SGerrit Uitslag     *
29559bc3b48SGerrit Uitslag     * @param string $text
29659bc3b48SGerrit Uitslag     * @param int $level
29759bc3b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
29859bc3b48SGerrit Uitslag     * @return string
299c06c1c7aSEsther Brunner     */
300957f36a6SAndreas Gohr    protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer)
301957f36a6SAndreas Gohr    {
302c06c1c7aSEsther Brunner        global $conf;
303c06c1c7aSEsther Brunner
30459bc3b48SGerrit Uitslag        $hid = '';
305c06c1c7aSEsther Brunner        if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) {
306e0c26282SGerrit Uitslag            $hid = $renderer->_headerToLink($text, true);
30754cc7aa4SAndreas Gohr            $renderer->toc[] = [
308c06c1c7aSEsther Brunner                'hid' => $hid,
309c06c1c7aSEsther Brunner                'title' => $text,
310c06c1c7aSEsther Brunner                'type' => 'ul',
31154cc7aa4SAndreas Gohr                'level' => $level - $conf['toptoclevel'] + 1
31254cc7aa4SAndreas Gohr            ];
313c06c1c7aSEsther Brunner        }
314c06c1c7aSEsther Brunner        return $hid;
315c06c1c7aSEsther Brunner    }
316f62ea8a1Sandi}
317