xref: /dokuwiki/lib/plugins/info/syntax.php (revision 54cc7aa41e0f453bd6887b0e79242a139d84a47a)
1f62ea8a1Sandi<?php
245a30e7cSAndreas Gohr
3*54cc7aa4SAndreas Gohruse dokuwiki\Extension\PluginInterface;
4f62ea8a1Sandi/**
5f62ea8a1Sandi * Info Plugin: Displays information about various DokuWiki internals
6f62ea8a1Sandi *
7f62ea8a1Sandi * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
8f62ea8a1Sandi * @author     Andreas Gohr <andi@splitbrain.org>
9c06c1c7aSEsther Brunner * @author     Esther Brunner <wikidesign@gmail.com>
10f62ea8a1Sandi */
11957f36a6SAndreas Gohrclass syntax_plugin_info extends DokuWiki_Syntax_Plugin
12957f36a6SAndreas Gohr{
13f62ea8a1Sandi
14f62ea8a1Sandi    /**
15f62ea8a1Sandi     * What kind of syntax are we?
16f62ea8a1Sandi     */
17957f36a6SAndreas Gohr    public function getType()
18957f36a6SAndreas Gohr    {
19f62ea8a1Sandi        return 'substition';
20f62ea8a1Sandi    }
21f62ea8a1Sandi
22f62ea8a1Sandi    /**
23896a5c22Sandi     * What about paragraphs?
24896a5c22Sandi     */
25957f36a6SAndreas Gohr    public function getPType()
26957f36a6SAndreas Gohr    {
27896a5c22Sandi        return 'block';
28896a5c22Sandi    }
29896a5c22Sandi
30896a5c22Sandi    /**
31f62ea8a1Sandi     * Where to sort in?
32f62ea8a1Sandi     */
33957f36a6SAndreas Gohr    public function getSort()
34957f36a6SAndreas Gohr    {
35f62ea8a1Sandi        return 155;
36f62ea8a1Sandi    }
37f62ea8a1Sandi
38f62ea8a1Sandi    /**
39f62ea8a1Sandi     * Connect pattern to lexer
40f62ea8a1Sandi     */
41957f36a6SAndreas Gohr    public function connectTo($mode)
42957f36a6SAndreas Gohr    {
43f62ea8a1Sandi        $this->Lexer->addSpecialPattern('~~INFO:\w+~~', $mode, 'plugin_info');
44f62ea8a1Sandi    }
45f62ea8a1Sandi
46f62ea8a1Sandi    /**
47f62ea8a1Sandi     * Handle the match
48253d4b48SGerrit Uitslag     *
49253d4b48SGerrit Uitslag     * @param string $match The text matched by the patterns
50253d4b48SGerrit Uitslag     * @param int $state The lexer state for the match
51253d4b48SGerrit Uitslag     * @param int $pos The character position of the matched text
52253d4b48SGerrit Uitslag     * @param Doku_Handler $handler The Doku_Handler object
53253d4b48SGerrit Uitslag     * @return  array Return an array with all data you want to use in render
54f62ea8a1Sandi     */
55957f36a6SAndreas Gohr    public function handle($match, $state, $pos, Doku_Handler $handler)
56957f36a6SAndreas Gohr    {
57f62ea8a1Sandi        $match = substr($match, 7, -2); //strip ~~INFO: from start and ~~ from end
58*54cc7aa4SAndreas Gohr        return [strtolower($match)];
59f62ea8a1Sandi    }
60f62ea8a1Sandi
61f62ea8a1Sandi    /**
62f62ea8a1Sandi     * Create output
63253d4b48SGerrit Uitslag     *
64253d4b48SGerrit Uitslag     * @param string $format string     output format being rendered
65253d4b48SGerrit Uitslag     * @param Doku_Renderer $renderer the current renderer object
66253d4b48SGerrit Uitslag     * @param array $data data created by handler()
67253d4b48SGerrit Uitslag     * @return  boolean                 rendered correctly?
68f62ea8a1Sandi     */
69957f36a6SAndreas Gohr    public function render($format, Doku_Renderer $renderer, $data)
70957f36a6SAndreas Gohr    {
71f4e5a570Schris        if ($format == 'xhtml') {
7274ed54d4SGerrit Uitslag            /** @var Doku_Renderer_xhtml $renderer */
73f62ea8a1Sandi            //handle various info stuff
74f62ea8a1Sandi            switch ($data[0]) {
75896a5c22Sandi                case 'syntaxmodes':
76957f36a6SAndreas Gohr                    $renderer->doc .= $this->renderSyntaxModes();
77f62ea8a1Sandi                    break;
78896a5c22Sandi                case 'syntaxtypes':
79957f36a6SAndreas Gohr                    $renderer->doc .= $this->renderSyntaxTypes();
80f62ea8a1Sandi                    break;
81896a5c22Sandi                case 'syntaxplugins':
82957f36a6SAndreas Gohr                    $this->renderPlugins('syntax', $renderer);
83c06c1c7aSEsther Brunner                    break;
84c06c1c7aSEsther Brunner                case 'adminplugins':
85957f36a6SAndreas Gohr                    $this->renderPlugins('admin', $renderer);
86c06c1c7aSEsther Brunner                    break;
87c06c1c7aSEsther Brunner                case 'actionplugins':
88957f36a6SAndreas Gohr                    $this->renderPlugins('action', $renderer);
89c06c1c7aSEsther Brunner                    break;
90c06c1c7aSEsther Brunner                case 'rendererplugins':
91957f36a6SAndreas Gohr                    $this->renderPlugins('renderer', $renderer);
92c06c1c7aSEsther Brunner                    break;
93c06c1c7aSEsther Brunner                case 'helperplugins':
94957f36a6SAndreas Gohr                    $this->renderPlugins('helper', $renderer);
95c06c1c7aSEsther Brunner                    break;
96603a6381SKlap-in                case 'authplugins':
97957f36a6SAndreas Gohr                    $this->renderPlugins('auth', $renderer);
98603a6381SKlap-in                    break;
99603a6381SKlap-in                case 'remoteplugins':
100957f36a6SAndreas Gohr                    $this->renderPlugins('remote', $renderer);
101603a6381SKlap-in                    break;
102c06c1c7aSEsther Brunner                case 'helpermethods':
103957f36a6SAndreas Gohr                    $this->renderHelperMethods($renderer);
104896a5c22Sandi                    break;
105e9ac59e9SAndreas Gohr                case 'hooks':
106e9ac59e9SAndreas Gohr                    $this->renderHooks($renderer);
107e9ac59e9SAndreas Gohr                    break;
1087210c855SAndreas Gohr                case 'datetime':
1097210c855SAndreas Gohr                    $renderer->doc .= date('r');
1107210c855SAndreas Gohr                    break;
111f62ea8a1Sandi                default:
112f62ea8a1Sandi                    $renderer->doc .= "no info about " . htmlspecialchars($data[0]);
113f62ea8a1Sandi            }
114f62ea8a1Sandi            return true;
115f62ea8a1Sandi        }
116f62ea8a1Sandi        return false;
117f62ea8a1Sandi    }
118f62ea8a1Sandi
119f62ea8a1Sandi    /**
120c06c1c7aSEsther Brunner     * list all installed plugins
121896a5c22Sandi     *
122896a5c22Sandi     * uses some of the original renderer methods
123253d4b48SGerrit Uitslag     *
124253d4b48SGerrit Uitslag     * @param string $type
1254baa5c86SAndreas Gohr     * @param Doku_Renderer $renderer
126896a5c22Sandi     */
1274baa5c86SAndreas Gohr    protected function renderPlugins($type, Doku_Renderer $renderer)
128957f36a6SAndreas Gohr    {
129896a5c22Sandi        global $lang;
130c06c1c7aSEsther Brunner        $plugins = plugin_list($type);
131*54cc7aa4SAndreas Gohr        $plginfo = [];
1325f5f3ddcSAndreas Gohr
1335f5f3ddcSAndreas Gohr        // remove subparts
134896a5c22Sandi        foreach ($plugins as $p) {
135*54cc7aa4SAndreas Gohr            $po = plugin_load($type, $p);
136*54cc7aa4SAndreas Gohr            if (! $po instanceof PluginInterface) continue;
137*54cc7aa4SAndreas Gohr            [$name, ] = explode('_', $p, 2);
1385f5f3ddcSAndreas Gohr            $plginfo[$name] = $po->getInfo();
1395f5f3ddcSAndreas Gohr        }
140896a5c22Sandi
1415f5f3ddcSAndreas Gohr        // list them
1424baa5c86SAndreas Gohr        $renderer->listu_open();
1435f5f3ddcSAndreas Gohr        foreach ($plginfo as $info) {
1444baa5c86SAndreas Gohr            $renderer->listitem_open(1);
1454baa5c86SAndreas Gohr            $renderer->listcontent_open();
146896a5c22Sandi            $renderer->externallink($info['url'], $info['name']);
1474baa5c86SAndreas Gohr            $renderer->cdata(' ');
1484baa5c86SAndreas Gohr            $renderer->emphasis_open();
1494baa5c86SAndreas Gohr            $renderer->cdata($info['date']);
1504baa5c86SAndreas Gohr            $renderer->emphasis_close();
1514baa5c86SAndreas Gohr            $renderer->cdata(' ' . $lang['by'] . ' ');
152896a5c22Sandi            $renderer->emaillink($info['email'], $info['author']);
1534baa5c86SAndreas Gohr            $renderer->linebreak();
1544baa5c86SAndreas Gohr            $renderer->cdata($info['desc']);
1554baa5c86SAndreas Gohr            $renderer->listcontent_close();
1564baa5c86SAndreas Gohr            $renderer->listitem_close();
157896a5c22Sandi        }
1584baa5c86SAndreas Gohr        $renderer->listu_close();
159896a5c22Sandi    }
160896a5c22Sandi
161896a5c22Sandi    /**
162c06c1c7aSEsther Brunner     * list all installed plugins
163c06c1c7aSEsther Brunner     *
164c06c1c7aSEsther Brunner     * uses some of the original renderer methods
165253d4b48SGerrit Uitslag     *
166253d4b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
167c06c1c7aSEsther Brunner     */
168957f36a6SAndreas Gohr    protected function renderHelperMethods(Doku_Renderer_xhtml $renderer)
169957f36a6SAndreas Gohr    {
170c06c1c7aSEsther Brunner        $plugins = plugin_list('helper');
171c06c1c7aSEsther Brunner        foreach ($plugins as $p) {
172*54cc7aa4SAndreas Gohr            $po = plugin_load('helper', $p);
173*54cc7aa4SAndreas Gohr            if (!$po instanceof PluginInterface) continue;
174c06c1c7aSEsther Brunner
175c06c1c7aSEsther Brunner            if (!method_exists($po, 'getMethods')) continue;
176c06c1c7aSEsther Brunner            $methods = $po->getMethods();
177c06c1c7aSEsther Brunner            $info = $po->getInfo();
178c06c1c7aSEsther Brunner
179957f36a6SAndreas Gohr            $hid = $this->addToToc($info['name'], 2, $renderer);
180c06c1c7aSEsther Brunner            $doc = '<h2><a name="' . $hid . '" id="' . $hid . '">' . hsc($info['name']) . '</a></h2>';
181c06c1c7aSEsther Brunner            $doc .= '<div class="level2">';
182*54cc7aa4SAndreas Gohr            $doc .= '<p>' . strtr(hsc($info['desc']), ["\n" => "<br />"]) . '</p>';
1839b3b9e8eSGerrit Uitslag            $doc .= '<pre class="code">$' . $p . " = plugin_load('helper', '" . $p . "');</pre>";
184c06c1c7aSEsther Brunner            $doc .= '</div>';
185c06c1c7aSEsther Brunner            foreach ($methods as $method) {
186c06c1c7aSEsther Brunner                $title = '$' . $p . '->' . $method['name'] . '()';
187957f36a6SAndreas Gohr                $hid = $this->addToToc($title, 3, $renderer);
188c06c1c7aSEsther Brunner                $doc .= '<h3><a name="' . $hid . '" id="' . $hid . '">' . hsc($title) . '</a></h3>';
189c06c1c7aSEsther Brunner                $doc .= '<div class="level3">';
190c7b28ffdSAnika Henke                $doc .= '<div class="table"><table class="inline"><tbody>';
191c06c1c7aSEsther Brunner                $doc .= '<tr><th>Description</th><td colspan="2">' . $method['desc'] .
192c06c1c7aSEsther Brunner                    '</td></tr>';
193c06c1c7aSEsther Brunner                if ($method['params']) {
194c06c1c7aSEsther Brunner                    $c = count($method['params']);
195c06c1c7aSEsther Brunner                    $doc .= '<tr><th rowspan="' . $c . '">Parameters</th><td>';
196*54cc7aa4SAndreas Gohr                    $params = [];
197c06c1c7aSEsther Brunner                    foreach ($method['params'] as $desc => $type) {
198c06c1c7aSEsther Brunner                        $params[] = hsc($desc) . '</td><td>' . hsc($type);
199c06c1c7aSEsther Brunner                    }
200*54cc7aa4SAndreas Gohr                    $doc .= implode('</td></tr><tr><td>', $params) . '</td></tr>';
201c06c1c7aSEsther Brunner                }
202c06c1c7aSEsther Brunner                if ($method['return']) {
203c06c1c7aSEsther Brunner                    $doc .= '<tr><th>Return value</th><td>' . hsc(key($method['return'])) .
204c06c1c7aSEsther Brunner                        '</td><td>' . hsc(current($method['return'])) . '</td></tr>';
205c06c1c7aSEsther Brunner                }
206c7b28ffdSAnika Henke                $doc .= '</tbody></table></div>';
207c06c1c7aSEsther Brunner                $doc .= '</div>';
208c06c1c7aSEsther Brunner            }
209c06c1c7aSEsther Brunner            unset($po);
210c06c1c7aSEsther Brunner
211c06c1c7aSEsther Brunner            $renderer->doc .= $doc;
212c06c1c7aSEsther Brunner        }
213c06c1c7aSEsther Brunner    }
214c06c1c7aSEsther Brunner
215c06c1c7aSEsther Brunner    /**
216f62ea8a1Sandi     * lists all known syntax types and their registered modes
217253d4b48SGerrit Uitslag     *
218253d4b48SGerrit Uitslag     * @return string
219f62ea8a1Sandi     */
220957f36a6SAndreas Gohr    protected function renderSyntaxTypes()
221957f36a6SAndreas Gohr    {
222f62ea8a1Sandi        global $PARSER_MODES;
223f62ea8a1Sandi        $doc = '';
224f62ea8a1Sandi
225c7b28ffdSAnika Henke        $doc .= '<div class="table"><table class="inline"><tbody>';
226f62ea8a1Sandi        foreach ($PARSER_MODES as $mode => $modes) {
227f62ea8a1Sandi            $doc .= '<tr>';
228f62ea8a1Sandi            $doc .= '<td class="leftalign">';
229f62ea8a1Sandi            $doc .= $mode;
230f62ea8a1Sandi            $doc .= '</td>';
231f62ea8a1Sandi            $doc .= '<td class="leftalign">';
232*54cc7aa4SAndreas Gohr            $doc .= implode(', ', $modes);
233f62ea8a1Sandi            $doc .= '</td>';
234f62ea8a1Sandi            $doc .= '</tr>';
235f62ea8a1Sandi        }
236c7b28ffdSAnika Henke        $doc .= '</tbody></table></div>';
237f62ea8a1Sandi        return $doc;
238f62ea8a1Sandi    }
239f62ea8a1Sandi
240f62ea8a1Sandi    /**
241f62ea8a1Sandi     * lists all known syntax modes and their sorting value
242253d4b48SGerrit Uitslag     *
243253d4b48SGerrit Uitslag     * @return string
244f62ea8a1Sandi     */
245957f36a6SAndreas Gohr    protected function renderSyntaxModes()
246957f36a6SAndreas Gohr    {
247f62ea8a1Sandi        $modes = p_get_parsermodes();
248f62ea8a1Sandi
249*54cc7aa4SAndreas Gohr        $compactmodes = [];
250f62ea8a1Sandi        foreach ($modes as $mode) {
251a27c9d6fSGerrit Uitslag            $compactmodes[$mode['sort']][] = $mode['mode'];
252f62ea8a1Sandi        }
253a27c9d6fSGerrit Uitslag        $doc = '';
254a27c9d6fSGerrit Uitslag        $doc .= '<div class="table"><table class="inline"><tbody>';
255a27c9d6fSGerrit Uitslag
256a27c9d6fSGerrit Uitslag        foreach ($compactmodes as $sort => $modes) {
257a27c9d6fSGerrit Uitslag            $rowspan = '';
258a27c9d6fSGerrit Uitslag            if (count($modes) > 1) {
259a27c9d6fSGerrit Uitslag                $rowspan = ' rowspan="' . count($modes) . '"';
260a27c9d6fSGerrit Uitslag            }
261a27c9d6fSGerrit Uitslag
262a27c9d6fSGerrit Uitslag            foreach ($modes as $index => $mode) {
263a27c9d6fSGerrit Uitslag                $doc .= '<tr>';
264a27c9d6fSGerrit Uitslag                $doc .= '<td class="leftalign">';
265a27c9d6fSGerrit Uitslag                $doc .= $mode;
266a27c9d6fSGerrit Uitslag                $doc .= '</td>';
267a27c9d6fSGerrit Uitslag
268a27c9d6fSGerrit Uitslag                if ($index === 0) {
269a27c9d6fSGerrit Uitslag                    $doc .= '<td class="rightalign" ' . $rowspan . '>';
270a27c9d6fSGerrit Uitslag                    $doc .= $sort;
271a27c9d6fSGerrit Uitslag                    $doc .= '</td>';
272a27c9d6fSGerrit Uitslag                }
273a27c9d6fSGerrit Uitslag                $doc .= '</tr>';
274a27c9d6fSGerrit Uitslag            }
275a27c9d6fSGerrit Uitslag        }
276a27c9d6fSGerrit Uitslag
277a27c9d6fSGerrit Uitslag        $doc .= '</tbody></table></div>';
278f62ea8a1Sandi        return $doc;
279f62ea8a1Sandi    }
280c06c1c7aSEsther Brunner
281c06c1c7aSEsther Brunner    /**
282e9ac59e9SAndreas Gohr     * Render all currently registered event handlers
283e9ac59e9SAndreas Gohr     *
284e9ac59e9SAndreas Gohr     * @param Doku_Renderer $renderer
285e9ac59e9SAndreas Gohr     */
286e9ac59e9SAndreas Gohr    protected function renderHooks(Doku_Renderer $renderer)
287e9ac59e9SAndreas Gohr    {
288e9ac59e9SAndreas Gohr        global $EVENT_HANDLER;
289e9ac59e9SAndreas Gohr
290e9ac59e9SAndreas Gohr        $list = $EVENT_HANDLER->getEventHandlers();
291e9ac59e9SAndreas Gohr        ksort($list);
292e9ac59e9SAndreas Gohr
293e9ac59e9SAndreas Gohr        $renderer->listu_open();
294e9ac59e9SAndreas Gohr        foreach ($list as $event => $handlers) {
295e9ac59e9SAndreas Gohr            $renderer->listitem_open(1);
296e9ac59e9SAndreas Gohr            $renderer->listcontent_open();
297e9ac59e9SAndreas Gohr            $renderer->cdata($event);
298e9ac59e9SAndreas Gohr            $renderer->listcontent_close();
299e9ac59e9SAndreas Gohr
300e9ac59e9SAndreas Gohr            $renderer->listo_open();
301e9ac59e9SAndreas Gohr            foreach ($handlers as $sequence) {
302e9ac59e9SAndreas Gohr                foreach ($sequence as $handler) {
303e9ac59e9SAndreas Gohr                    $renderer->listitem_open(2);
304e9ac59e9SAndreas Gohr                    $renderer->listcontent_open();
305e9ac59e9SAndreas Gohr                    $renderer->cdata(get_class($handler[0]) . '::' . $handler[1] . '()');
306e9ac59e9SAndreas Gohr                    $renderer->listcontent_close();
307e9ac59e9SAndreas Gohr                    $renderer->listitem_close();
308e9ac59e9SAndreas Gohr                }
309e9ac59e9SAndreas Gohr            }
310e9ac59e9SAndreas Gohr            $renderer->listo_close();
311e9ac59e9SAndreas Gohr            $renderer->listitem_close();
312e9ac59e9SAndreas Gohr        }
313e9ac59e9SAndreas Gohr        $renderer->listu_close();
314e9ac59e9SAndreas Gohr    }
315e9ac59e9SAndreas Gohr
316e9ac59e9SAndreas Gohr    /**
317c06c1c7aSEsther Brunner     * Adds a TOC item
31859bc3b48SGerrit Uitslag     *
31959bc3b48SGerrit Uitslag     * @param string $text
32059bc3b48SGerrit Uitslag     * @param int $level
32159bc3b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
32259bc3b48SGerrit Uitslag     * @return string
323c06c1c7aSEsther Brunner     */
324957f36a6SAndreas Gohr    protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer)
325957f36a6SAndreas Gohr    {
326c06c1c7aSEsther Brunner        global $conf;
327c06c1c7aSEsther Brunner
32859bc3b48SGerrit Uitslag        $hid = '';
329c06c1c7aSEsther Brunner        if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) {
330e0c26282SGerrit Uitslag            $hid = $renderer->_headerToLink($text, true);
331*54cc7aa4SAndreas Gohr            $renderer->toc[] = [
332c06c1c7aSEsther Brunner                'hid' => $hid,
333c06c1c7aSEsther Brunner                'title' => $text,
334c06c1c7aSEsther Brunner                'type' => 'ul',
335*54cc7aa4SAndreas Gohr                'level' => $level - $conf['toptoclevel'] + 1
336*54cc7aa4SAndreas Gohr            ];
337c06c1c7aSEsther Brunner        }
338c06c1c7aSEsther Brunner        return $hid;
339c06c1c7aSEsther Brunner    }
340f62ea8a1Sandi}
341