xref: /dokuwiki/lib/plugins/info/syntax.php (revision d4f83172d9533c4d84f450fe22ef630816b21d75)
1f62ea8a1Sandi<?php
245a30e7cSAndreas Gohr
38553d24dSAndreas Gohruse dokuwiki\Extension\SyntaxPlugin;
454cc7aa4SAndreas Gohruse dokuwiki\Extension\PluginInterface;
5*d4f83172SAndreas 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
75f62ea8a1Sandi            switch ($data[0]) {
76896a5c22Sandi                case 'syntaxmodes':
77957f36a6SAndreas Gohr                    $renderer->doc .= $this->renderSyntaxModes();
78f62ea8a1Sandi                    break;
79896a5c22Sandi                case 'syntaxtypes':
80957f36a6SAndreas Gohr                    $renderer->doc .= $this->renderSyntaxTypes();
81f62ea8a1Sandi                    break;
82896a5c22Sandi                case 'syntaxplugins':
83957f36a6SAndreas Gohr                    $this->renderPlugins('syntax', $renderer);
84c06c1c7aSEsther Brunner                    break;
85c06c1c7aSEsther Brunner                case 'adminplugins':
86957f36a6SAndreas Gohr                    $this->renderPlugins('admin', $renderer);
87c06c1c7aSEsther Brunner                    break;
88c06c1c7aSEsther Brunner                case 'actionplugins':
89957f36a6SAndreas Gohr                    $this->renderPlugins('action', $renderer);
90c06c1c7aSEsther Brunner                    break;
91c06c1c7aSEsther Brunner                case 'rendererplugins':
92957f36a6SAndreas Gohr                    $this->renderPlugins('renderer', $renderer);
93c06c1c7aSEsther Brunner                    break;
94c06c1c7aSEsther Brunner                case 'helperplugins':
95957f36a6SAndreas Gohr                    $this->renderPlugins('helper', $renderer);
96c06c1c7aSEsther Brunner                    break;
97603a6381SKlap-in                case 'authplugins':
98957f36a6SAndreas Gohr                    $this->renderPlugins('auth', $renderer);
99603a6381SKlap-in                    break;
100603a6381SKlap-in                case 'remoteplugins':
101957f36a6SAndreas Gohr                    $this->renderPlugins('remote', $renderer);
102603a6381SKlap-in                    break;
103c06c1c7aSEsther Brunner                case 'helpermethods':
104957f36a6SAndreas Gohr                    $this->renderHelperMethods($renderer);
105896a5c22Sandi                    break;
106e9ac59e9SAndreas Gohr                case 'hooks':
107e9ac59e9SAndreas Gohr                    $this->renderHooks($renderer);
108e9ac59e9SAndreas Gohr                    break;
1097210c855SAndreas Gohr                case 'datetime':
1107210c855SAndreas Gohr                    $renderer->doc .= date('r');
1117210c855SAndreas Gohr                    break;
112f62ea8a1Sandi                default:
113f62ea8a1Sandi                    $renderer->doc .= "no info about " . htmlspecialchars($data[0]);
114f62ea8a1Sandi            }
115f62ea8a1Sandi            return true;
116f62ea8a1Sandi        }
117f62ea8a1Sandi        return false;
118f62ea8a1Sandi    }
119f62ea8a1Sandi
120f62ea8a1Sandi    /**
121c06c1c7aSEsther Brunner     * list all installed plugins
122896a5c22Sandi     *
123896a5c22Sandi     * uses some of the original renderer methods
124253d4b48SGerrit Uitslag     *
125253d4b48SGerrit Uitslag     * @param string $type
1264baa5c86SAndreas Gohr     * @param Doku_Renderer $renderer
127896a5c22Sandi     */
1284baa5c86SAndreas Gohr    protected function renderPlugins($type, Doku_Renderer $renderer)
129957f36a6SAndreas Gohr    {
130896a5c22Sandi        global $lang;
131c06c1c7aSEsther Brunner        $plugins = plugin_list($type);
13254cc7aa4SAndreas Gohr        $plginfo = [];
1335f5f3ddcSAndreas Gohr
1345f5f3ddcSAndreas Gohr        // remove subparts
135896a5c22Sandi        foreach ($plugins as $p) {
13654cc7aa4SAndreas Gohr            $po = plugin_load($type, $p);
13754cc7aa4SAndreas Gohr            if (! $po instanceof PluginInterface) continue;
138a19c9aa0SGerrit Uitslag            [$name, /* part */] = explode('_', $p, 2);
1395f5f3ddcSAndreas Gohr            $plginfo[$name] = $po->getInfo();
1405f5f3ddcSAndreas Gohr        }
141896a5c22Sandi
1425f5f3ddcSAndreas Gohr        // list them
1434baa5c86SAndreas Gohr        $renderer->listu_open();
1445f5f3ddcSAndreas Gohr        foreach ($plginfo as $info) {
1454baa5c86SAndreas Gohr            $renderer->listitem_open(1);
1464baa5c86SAndreas Gohr            $renderer->listcontent_open();
147896a5c22Sandi            $renderer->externallink($info['url'], $info['name']);
1484baa5c86SAndreas Gohr            $renderer->cdata(' ');
1494baa5c86SAndreas Gohr            $renderer->emphasis_open();
1504baa5c86SAndreas Gohr            $renderer->cdata($info['date']);
1514baa5c86SAndreas Gohr            $renderer->emphasis_close();
1524baa5c86SAndreas Gohr            $renderer->cdata(' ' . $lang['by'] . ' ');
153896a5c22Sandi            $renderer->emaillink($info['email'], $info['author']);
1544baa5c86SAndreas Gohr            $renderer->linebreak();
1554baa5c86SAndreas Gohr            $renderer->cdata($info['desc']);
1564baa5c86SAndreas Gohr            $renderer->listcontent_close();
1574baa5c86SAndreas Gohr            $renderer->listitem_close();
158896a5c22Sandi        }
1594baa5c86SAndreas Gohr        $renderer->listu_close();
160896a5c22Sandi    }
161896a5c22Sandi
162896a5c22Sandi    /**
163c06c1c7aSEsther Brunner     * list all installed plugins
164c06c1c7aSEsther Brunner     *
165c06c1c7aSEsther Brunner     * uses some of the original renderer methods
166253d4b48SGerrit Uitslag     *
167253d4b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
168c06c1c7aSEsther Brunner     */
169957f36a6SAndreas Gohr    protected function renderHelperMethods(Doku_Renderer_xhtml $renderer)
170957f36a6SAndreas Gohr    {
171c06c1c7aSEsther Brunner        $plugins = plugin_list('helper');
172c06c1c7aSEsther Brunner        foreach ($plugins as $p) {
17354cc7aa4SAndreas Gohr            $po = plugin_load('helper', $p);
17454cc7aa4SAndreas Gohr            if (!$po instanceof PluginInterface) continue;
175c06c1c7aSEsther Brunner
176c06c1c7aSEsther Brunner            if (!method_exists($po, 'getMethods')) continue;
177c06c1c7aSEsther Brunner            $methods = $po->getMethods();
178c06c1c7aSEsther Brunner            $info = $po->getInfo();
179c06c1c7aSEsther Brunner
180957f36a6SAndreas Gohr            $hid = $this->addToToc($info['name'], 2, $renderer);
181c06c1c7aSEsther Brunner            $doc = '<h2><a name="' . $hid . '" id="' . $hid . '">' . hsc($info['name']) . '</a></h2>';
182c06c1c7aSEsther Brunner            $doc .= '<div class="level2">';
18354cc7aa4SAndreas Gohr            $doc .= '<p>' . strtr(hsc($info['desc']), ["\n" => "<br />"]) . '</p>';
1849b3b9e8eSGerrit Uitslag            $doc .= '<pre class="code">$' . $p . " = plugin_load('helper', '" . $p . "');</pre>";
185c06c1c7aSEsther Brunner            $doc .= '</div>';
186c06c1c7aSEsther Brunner            foreach ($methods as $method) {
187c06c1c7aSEsther Brunner                $title = '$' . $p . '->' . $method['name'] . '()';
188957f36a6SAndreas Gohr                $hid = $this->addToToc($title, 3, $renderer);
189c06c1c7aSEsther Brunner                $doc .= '<h3><a name="' . $hid . '" id="' . $hid . '">' . hsc($title) . '</a></h3>';
190c06c1c7aSEsther Brunner                $doc .= '<div class="level3">';
191c7b28ffdSAnika Henke                $doc .= '<div class="table"><table class="inline"><tbody>';
192c06c1c7aSEsther Brunner                $doc .= '<tr><th>Description</th><td colspan="2">' . $method['desc'] .
193c06c1c7aSEsther Brunner                    '</td></tr>';
194c06c1c7aSEsther Brunner                if ($method['params']) {
195c06c1c7aSEsther Brunner                    $c = count($method['params']);
196c06c1c7aSEsther Brunner                    $doc .= '<tr><th rowspan="' . $c . '">Parameters</th><td>';
19754cc7aa4SAndreas Gohr                    $params = [];
198c06c1c7aSEsther Brunner                    foreach ($method['params'] as $desc => $type) {
199c06c1c7aSEsther Brunner                        $params[] = hsc($desc) . '</td><td>' . hsc($type);
200c06c1c7aSEsther Brunner                    }
20154cc7aa4SAndreas Gohr                    $doc .= implode('</td></tr><tr><td>', $params) . '</td></tr>';
202c06c1c7aSEsther Brunner                }
203c06c1c7aSEsther Brunner                if ($method['return']) {
204c06c1c7aSEsther Brunner                    $doc .= '<tr><th>Return value</th><td>' . hsc(key($method['return'])) .
205c06c1c7aSEsther Brunner                        '</td><td>' . hsc(current($method['return'])) . '</td></tr>';
206c06c1c7aSEsther Brunner                }
207c7b28ffdSAnika Henke                $doc .= '</tbody></table></div>';
208c06c1c7aSEsther Brunner                $doc .= '</div>';
209c06c1c7aSEsther Brunner            }
210c06c1c7aSEsther Brunner            unset($po);
211c06c1c7aSEsther Brunner
212c06c1c7aSEsther Brunner            $renderer->doc .= $doc;
213c06c1c7aSEsther Brunner        }
214c06c1c7aSEsther Brunner    }
215c06c1c7aSEsther Brunner
216c06c1c7aSEsther Brunner    /**
217f62ea8a1Sandi     * lists all known syntax types and their registered modes
218253d4b48SGerrit Uitslag     *
219253d4b48SGerrit Uitslag     * @return string
220f62ea8a1Sandi     */
221957f36a6SAndreas Gohr    protected function renderSyntaxTypes()
222957f36a6SAndreas Gohr    {
223f62ea8a1Sandi        global $PARSER_MODES;
224f62ea8a1Sandi        $doc = '';
225f62ea8a1Sandi
226c7b28ffdSAnika Henke        $doc .= '<div class="table"><table class="inline"><tbody>';
227f62ea8a1Sandi        foreach ($PARSER_MODES as $mode => $modes) {
228f62ea8a1Sandi            $doc .= '<tr>';
229f62ea8a1Sandi            $doc .= '<td class="leftalign">';
230f62ea8a1Sandi            $doc .= $mode;
231f62ea8a1Sandi            $doc .= '</td>';
232f62ea8a1Sandi            $doc .= '<td class="leftalign">';
23354cc7aa4SAndreas Gohr            $doc .= implode(', ', $modes);
234f62ea8a1Sandi            $doc .= '</td>';
235f62ea8a1Sandi            $doc .= '</tr>';
236f62ea8a1Sandi        }
237c7b28ffdSAnika Henke        $doc .= '</tbody></table></div>';
238f62ea8a1Sandi        return $doc;
239f62ea8a1Sandi    }
240f62ea8a1Sandi
241f62ea8a1Sandi    /**
242f62ea8a1Sandi     * lists all known syntax modes and their sorting value
243253d4b48SGerrit Uitslag     *
244253d4b48SGerrit Uitslag     * @return string
245f62ea8a1Sandi     */
246957f36a6SAndreas Gohr    protected function renderSyntaxModes()
247957f36a6SAndreas Gohr    {
248f62ea8a1Sandi        $modes = p_get_parsermodes();
249f62ea8a1Sandi
25054cc7aa4SAndreas Gohr        $compactmodes = [];
251f62ea8a1Sandi        foreach ($modes as $mode) {
252a27c9d6fSGerrit Uitslag            $compactmodes[$mode['sort']][] = $mode['mode'];
253f62ea8a1Sandi        }
254a27c9d6fSGerrit Uitslag        $doc = '';
255a27c9d6fSGerrit Uitslag        $doc .= '<div class="table"><table class="inline"><tbody>';
256a27c9d6fSGerrit Uitslag
257a27c9d6fSGerrit Uitslag        foreach ($compactmodes as $sort => $modes) {
258a27c9d6fSGerrit Uitslag            $rowspan = '';
259a27c9d6fSGerrit Uitslag            if (count($modes) > 1) {
260a27c9d6fSGerrit Uitslag                $rowspan = ' rowspan="' . count($modes) . '"';
261a27c9d6fSGerrit Uitslag            }
262a27c9d6fSGerrit Uitslag
263a27c9d6fSGerrit Uitslag            foreach ($modes as $index => $mode) {
264a27c9d6fSGerrit Uitslag                $doc .= '<tr>';
265a27c9d6fSGerrit Uitslag                $doc .= '<td class="leftalign">';
266a27c9d6fSGerrit Uitslag                $doc .= $mode;
267a27c9d6fSGerrit Uitslag                $doc .= '</td>';
268a27c9d6fSGerrit Uitslag
269a27c9d6fSGerrit Uitslag                if ($index === 0) {
270a27c9d6fSGerrit Uitslag                    $doc .= '<td class="rightalign" ' . $rowspan . '>';
271a27c9d6fSGerrit Uitslag                    $doc .= $sort;
272a27c9d6fSGerrit Uitslag                    $doc .= '</td>';
273a27c9d6fSGerrit Uitslag                }
274a27c9d6fSGerrit Uitslag                $doc .= '</tr>';
275a27c9d6fSGerrit Uitslag            }
276a27c9d6fSGerrit Uitslag        }
277a27c9d6fSGerrit Uitslag
278a27c9d6fSGerrit Uitslag        $doc .= '</tbody></table></div>';
279f62ea8a1Sandi        return $doc;
280f62ea8a1Sandi    }
281c06c1c7aSEsther Brunner
282c06c1c7aSEsther Brunner    /**
283e9ac59e9SAndreas Gohr     * Render all currently registered event handlers
284e9ac59e9SAndreas Gohr     *
285e9ac59e9SAndreas Gohr     * @param Doku_Renderer $renderer
286e9ac59e9SAndreas Gohr     */
287e9ac59e9SAndreas Gohr    protected function renderHooks(Doku_Renderer $renderer)
288e9ac59e9SAndreas Gohr    {
289e9ac59e9SAndreas Gohr        global $EVENT_HANDLER;
290e9ac59e9SAndreas Gohr
291e9ac59e9SAndreas Gohr        $list = $EVENT_HANDLER->getEventHandlers();
292e9ac59e9SAndreas Gohr        ksort($list);
293e9ac59e9SAndreas Gohr
294e9ac59e9SAndreas Gohr        $renderer->listu_open();
295e9ac59e9SAndreas Gohr        foreach ($list as $event => $handlers) {
296e9ac59e9SAndreas Gohr            $renderer->listitem_open(1);
297e9ac59e9SAndreas Gohr            $renderer->listcontent_open();
298e9ac59e9SAndreas Gohr            $renderer->cdata($event);
299e9ac59e9SAndreas Gohr            $renderer->listcontent_close();
300e9ac59e9SAndreas Gohr
301e9ac59e9SAndreas Gohr            $renderer->listo_open();
302e9ac59e9SAndreas Gohr            foreach ($handlers as $sequence) {
303e9ac59e9SAndreas Gohr                foreach ($sequence as $handler) {
304e9ac59e9SAndreas Gohr                    $renderer->listitem_open(2);
305e9ac59e9SAndreas Gohr                    $renderer->listcontent_open();
306e9ac59e9SAndreas Gohr                    $renderer->cdata(get_class($handler[0]) . '::' . $handler[1] . '()');
307e9ac59e9SAndreas Gohr                    $renderer->listcontent_close();
308e9ac59e9SAndreas Gohr                    $renderer->listitem_close();
309e9ac59e9SAndreas Gohr                }
310e9ac59e9SAndreas Gohr            }
311e9ac59e9SAndreas Gohr            $renderer->listo_close();
312e9ac59e9SAndreas Gohr            $renderer->listitem_close();
313e9ac59e9SAndreas Gohr        }
314e9ac59e9SAndreas Gohr        $renderer->listu_close();
315e9ac59e9SAndreas Gohr    }
316e9ac59e9SAndreas Gohr
317e9ac59e9SAndreas Gohr    /**
318c06c1c7aSEsther Brunner     * Adds a TOC item
31959bc3b48SGerrit Uitslag     *
32059bc3b48SGerrit Uitslag     * @param string $text
32159bc3b48SGerrit Uitslag     * @param int $level
32259bc3b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
32359bc3b48SGerrit Uitslag     * @return string
324c06c1c7aSEsther Brunner     */
325957f36a6SAndreas Gohr    protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer)
326957f36a6SAndreas Gohr    {
327c06c1c7aSEsther Brunner        global $conf;
328c06c1c7aSEsther Brunner
32959bc3b48SGerrit Uitslag        $hid = '';
330c06c1c7aSEsther Brunner        if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) {
331e0c26282SGerrit Uitslag            $hid = $renderer->_headerToLink($text, true);
33254cc7aa4SAndreas Gohr            $renderer->toc[] = [
333c06c1c7aSEsther Brunner                'hid' => $hid,
334c06c1c7aSEsther Brunner                'title' => $text,
335c06c1c7aSEsther Brunner                'type' => 'ul',
33654cc7aa4SAndreas Gohr                'level' => $level - $conf['toptoclevel'] + 1
33754cc7aa4SAndreas Gohr            ];
338c06c1c7aSEsther Brunner        }
339c06c1c7aSEsther Brunner        return $hid;
340c06c1c7aSEsther Brunner    }
341f62ea8a1Sandi}
342