xref: /dokuwiki/lib/plugins/info/syntax.php (revision 560c60615d71edfc7ebfd6408c3c258e3c3ffc5a)
1f62ea8a1Sandi<?php
245a30e7cSAndreas Gohr
38553d24dSAndreas Gohruse dokuwiki\Extension\SyntaxPlugin;
454cc7aa4SAndreas Gohruse dokuwiki\Extension\PluginInterface;
5*560c6061SAndreas Gohruse dokuwiki\Parsing\ModeRegistry;
6d4f83172SAndreas Gohr
7f62ea8a1Sandi/**
8f62ea8a1Sandi * Info Plugin: Displays information about various DokuWiki internals
9f62ea8a1Sandi *
10f62ea8a1Sandi * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
11f62ea8a1Sandi * @author     Andreas Gohr <andi@splitbrain.org>
12c06c1c7aSEsther Brunner * @author     Esther Brunner <wikidesign@gmail.com>
13f62ea8a1Sandi */
148553d24dSAndreas Gohrclass syntax_plugin_info extends SyntaxPlugin
15957f36a6SAndreas Gohr{
16f62ea8a1Sandi    /**
17f62ea8a1Sandi     * What kind of syntax are we?
18f62ea8a1Sandi     */
19957f36a6SAndreas Gohr    public function getType()
20957f36a6SAndreas Gohr    {
21*560c6061SAndreas Gohr        return ModeRegistry::CATEGORY_SUBSTITUTION;
22f62ea8a1Sandi    }
23f62ea8a1Sandi
24f62ea8a1Sandi    /**
25896a5c22Sandi     * What about paragraphs?
26896a5c22Sandi     */
27957f36a6SAndreas Gohr    public function getPType()
28957f36a6SAndreas Gohr    {
29896a5c22Sandi        return 'block';
30896a5c22Sandi    }
31896a5c22Sandi
32896a5c22Sandi    /**
33f62ea8a1Sandi     * Where to sort in?
34f62ea8a1Sandi     */
35957f36a6SAndreas Gohr    public function getSort()
36957f36a6SAndreas Gohr    {
37f62ea8a1Sandi        return 155;
38f62ea8a1Sandi    }
39f62ea8a1Sandi
40f62ea8a1Sandi    /**
41f62ea8a1Sandi     * Connect pattern to lexer
42f62ea8a1Sandi     */
43957f36a6SAndreas Gohr    public function connectTo($mode)
44957f36a6SAndreas Gohr    {
45f62ea8a1Sandi        $this->Lexer->addSpecialPattern('~~INFO:\w+~~', $mode, 'plugin_info');
46f62ea8a1Sandi    }
47f62ea8a1Sandi
48f62ea8a1Sandi    /**
49f62ea8a1Sandi     * Handle the match
50253d4b48SGerrit Uitslag     *
51253d4b48SGerrit Uitslag     * @param string $match The text matched by the patterns
52253d4b48SGerrit Uitslag     * @param int $state The lexer state for the match
53253d4b48SGerrit Uitslag     * @param int $pos The character position of the matched text
54253d4b48SGerrit Uitslag     * @param Doku_Handler $handler The Doku_Handler object
55253d4b48SGerrit Uitslag     * @return  array Return an array with all data you want to use in render
56f62ea8a1Sandi     */
57957f36a6SAndreas Gohr    public function handle($match, $state, $pos, Doku_Handler $handler)
58957f36a6SAndreas Gohr    {
59f62ea8a1Sandi        $match = substr($match, 7, -2); //strip ~~INFO: from start and ~~ from end
6054cc7aa4SAndreas Gohr        return [strtolower($match)];
61f62ea8a1Sandi    }
62f62ea8a1Sandi
63f62ea8a1Sandi    /**
64f62ea8a1Sandi     * Create output
65253d4b48SGerrit Uitslag     *
66253d4b48SGerrit Uitslag     * @param string $format string     output format being rendered
67253d4b48SGerrit Uitslag     * @param Doku_Renderer $renderer the current renderer object
68253d4b48SGerrit Uitslag     * @param array $data data created by handler()
69253d4b48SGerrit Uitslag     * @return  boolean                 rendered correctly?
70f62ea8a1Sandi     */
71957f36a6SAndreas Gohr    public function render($format, Doku_Renderer $renderer, $data)
72957f36a6SAndreas Gohr    {
73f4e5a570Schris        if ($format == 'xhtml') {
7474ed54d4SGerrit Uitslag            /** @var Doku_Renderer_xhtml $renderer */
75f62ea8a1Sandi            //handle various info stuff
76093fe67eSAndreas Gohr            match ($data[0]) {
77093fe67eSAndreas Gohr                'syntaxmodes' => $renderer->doc .= $this->renderSyntaxModes(),
78093fe67eSAndreas Gohr                'syntaxtypes' => $renderer->doc .= $this->renderSyntaxTypes(),
79093fe67eSAndreas Gohr                'syntaxplugins' => $this->renderPlugins('syntax', $renderer),
80093fe67eSAndreas Gohr                'adminplugins' => $this->renderPlugins('admin', $renderer),
81093fe67eSAndreas Gohr                'actionplugins' => $this->renderPlugins('action', $renderer),
82093fe67eSAndreas Gohr                'rendererplugins' => $this->renderPlugins('renderer', $renderer),
83093fe67eSAndreas Gohr                'helperplugins' => $this->renderPlugins('helper', $renderer),
84093fe67eSAndreas Gohr                'authplugins' => $this->renderPlugins('auth', $renderer),
85093fe67eSAndreas Gohr                'remoteplugins' => $this->renderPlugins('remote', $renderer),
86093fe67eSAndreas Gohr                'helpermethods' => $this->renderHelperMethods($renderer),
87093fe67eSAndreas Gohr                'hooks' => $this->renderHooks($renderer),
88093fe67eSAndreas Gohr                'datetime' => $renderer->doc .= date('r'),
89093fe67eSAndreas Gohr                default => $renderer->doc .= "no info about " . htmlspecialchars($data[0]),
90093fe67eSAndreas Gohr            };
91f62ea8a1Sandi            return true;
92f62ea8a1Sandi        }
93f62ea8a1Sandi        return false;
94f62ea8a1Sandi    }
95f62ea8a1Sandi
96f62ea8a1Sandi    /**
97c06c1c7aSEsther Brunner     * list all installed plugins
98896a5c22Sandi     *
99896a5c22Sandi     * uses some of the original renderer methods
100253d4b48SGerrit Uitslag     *
101253d4b48SGerrit Uitslag     * @param string $type
1024baa5c86SAndreas Gohr     * @param Doku_Renderer $renderer
103896a5c22Sandi     */
1044baa5c86SAndreas Gohr    protected function renderPlugins($type, Doku_Renderer $renderer)
105957f36a6SAndreas Gohr    {
106896a5c22Sandi        global $lang;
107c06c1c7aSEsther Brunner        $plugins = plugin_list($type);
10854cc7aa4SAndreas Gohr        $plginfo = [];
1095f5f3ddcSAndreas Gohr
1105f5f3ddcSAndreas Gohr        // remove subparts
111896a5c22Sandi        foreach ($plugins as $p) {
11254cc7aa4SAndreas Gohr            $po = plugin_load($type, $p);
11354cc7aa4SAndreas Gohr            if (! $po instanceof PluginInterface) continue;
114a19c9aa0SGerrit Uitslag            [$name, /* part */] = explode('_', $p, 2);
1155f5f3ddcSAndreas Gohr            $plginfo[$name] = $po->getInfo();
1165f5f3ddcSAndreas Gohr        }
117896a5c22Sandi
1185f5f3ddcSAndreas Gohr        // list them
1194baa5c86SAndreas Gohr        $renderer->listu_open();
1205f5f3ddcSAndreas Gohr        foreach ($plginfo as $info) {
1214baa5c86SAndreas Gohr            $renderer->listitem_open(1);
1224baa5c86SAndreas Gohr            $renderer->listcontent_open();
123896a5c22Sandi            $renderer->externallink($info['url'], $info['name']);
1244baa5c86SAndreas Gohr            $renderer->cdata(' ');
1254baa5c86SAndreas Gohr            $renderer->emphasis_open();
1264baa5c86SAndreas Gohr            $renderer->cdata($info['date']);
1274baa5c86SAndreas Gohr            $renderer->emphasis_close();
1284baa5c86SAndreas Gohr            $renderer->cdata(' ' . $lang['by'] . ' ');
129896a5c22Sandi            $renderer->emaillink($info['email'], $info['author']);
1304baa5c86SAndreas Gohr            $renderer->linebreak();
1314baa5c86SAndreas Gohr            $renderer->cdata($info['desc']);
1324baa5c86SAndreas Gohr            $renderer->listcontent_close();
1334baa5c86SAndreas Gohr            $renderer->listitem_close();
134896a5c22Sandi        }
1354baa5c86SAndreas Gohr        $renderer->listu_close();
136896a5c22Sandi    }
137896a5c22Sandi
138896a5c22Sandi    /**
139c06c1c7aSEsther Brunner     * list all installed plugins
140c06c1c7aSEsther Brunner     *
141c06c1c7aSEsther Brunner     * uses some of the original renderer methods
142253d4b48SGerrit Uitslag     *
143253d4b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
144c06c1c7aSEsther Brunner     */
145957f36a6SAndreas Gohr    protected function renderHelperMethods(Doku_Renderer_xhtml $renderer)
146957f36a6SAndreas Gohr    {
147c06c1c7aSEsther Brunner        $plugins = plugin_list('helper');
148c06c1c7aSEsther Brunner        foreach ($plugins as $p) {
14954cc7aa4SAndreas Gohr            $po = plugin_load('helper', $p);
15054cc7aa4SAndreas Gohr            if (!$po instanceof PluginInterface) continue;
151c06c1c7aSEsther Brunner
152c06c1c7aSEsther Brunner            if (!method_exists($po, 'getMethods')) continue;
153c06c1c7aSEsther Brunner            $methods = $po->getMethods();
154c06c1c7aSEsther Brunner            $info = $po->getInfo();
155c06c1c7aSEsther Brunner
156957f36a6SAndreas Gohr            $hid = $this->addToToc($info['name'], 2, $renderer);
157c06c1c7aSEsther Brunner            $doc = '<h2><a name="' . $hid . '" id="' . $hid . '">' . hsc($info['name']) . '</a></h2>';
158c06c1c7aSEsther Brunner            $doc .= '<div class="level2">';
15954cc7aa4SAndreas Gohr            $doc .= '<p>' . strtr(hsc($info['desc']), ["\n" => "<br />"]) . '</p>';
1609b3b9e8eSGerrit Uitslag            $doc .= '<pre class="code">$' . $p . " = plugin_load('helper', '" . $p . "');</pre>";
161c06c1c7aSEsther Brunner            $doc .= '</div>';
162c06c1c7aSEsther Brunner            foreach ($methods as $method) {
163c06c1c7aSEsther Brunner                $title = '$' . $p . '->' . $method['name'] . '()';
164957f36a6SAndreas Gohr                $hid = $this->addToToc($title, 3, $renderer);
165c06c1c7aSEsther Brunner                $doc .= '<h3><a name="' . $hid . '" id="' . $hid . '">' . hsc($title) . '</a></h3>';
166c06c1c7aSEsther Brunner                $doc .= '<div class="level3">';
167c7b28ffdSAnika Henke                $doc .= '<div class="table"><table class="inline"><tbody>';
168c06c1c7aSEsther Brunner                $doc .= '<tr><th>Description</th><td colspan="2">' . $method['desc'] .
169c06c1c7aSEsther Brunner                    '</td></tr>';
170c06c1c7aSEsther Brunner                if ($method['params']) {
171c06c1c7aSEsther Brunner                    $c = count($method['params']);
172c06c1c7aSEsther Brunner                    $doc .= '<tr><th rowspan="' . $c . '">Parameters</th><td>';
17354cc7aa4SAndreas Gohr                    $params = [];
174c06c1c7aSEsther Brunner                    foreach ($method['params'] as $desc => $type) {
175c06c1c7aSEsther Brunner                        $params[] = hsc($desc) . '</td><td>' . hsc($type);
176c06c1c7aSEsther Brunner                    }
17754cc7aa4SAndreas Gohr                    $doc .= implode('</td></tr><tr><td>', $params) . '</td></tr>';
178c06c1c7aSEsther Brunner                }
179c06c1c7aSEsther Brunner                if ($method['return']) {
180c06c1c7aSEsther Brunner                    $doc .= '<tr><th>Return value</th><td>' . hsc(key($method['return'])) .
181c06c1c7aSEsther Brunner                        '</td><td>' . hsc(current($method['return'])) . '</td></tr>';
182c06c1c7aSEsther Brunner                }
183c7b28ffdSAnika Henke                $doc .= '</tbody></table></div>';
184c06c1c7aSEsther Brunner                $doc .= '</div>';
185c06c1c7aSEsther Brunner            }
186c06c1c7aSEsther Brunner            unset($po);
187c06c1c7aSEsther Brunner
188c06c1c7aSEsther Brunner            $renderer->doc .= $doc;
189c06c1c7aSEsther Brunner        }
190c06c1c7aSEsther Brunner    }
191c06c1c7aSEsther Brunner
192c06c1c7aSEsther Brunner    /**
193f62ea8a1Sandi     * lists all known syntax types and their registered modes
194253d4b48SGerrit Uitslag     *
195253d4b48SGerrit Uitslag     * @return string
196f62ea8a1Sandi     */
197957f36a6SAndreas Gohr    protected function renderSyntaxTypes()
198957f36a6SAndreas Gohr    {
199f62ea8a1Sandi        global $PARSER_MODES;
200f62ea8a1Sandi        $doc = '';
201f62ea8a1Sandi
202c7b28ffdSAnika Henke        $doc .= '<div class="table"><table class="inline"><tbody>';
203f62ea8a1Sandi        foreach ($PARSER_MODES as $mode => $modes) {
204f62ea8a1Sandi            $doc .= '<tr>';
205f62ea8a1Sandi            $doc .= '<td class="leftalign">';
206f62ea8a1Sandi            $doc .= $mode;
207f62ea8a1Sandi            $doc .= '</td>';
208f62ea8a1Sandi            $doc .= '<td class="leftalign">';
20954cc7aa4SAndreas Gohr            $doc .= implode(', ', $modes);
210f62ea8a1Sandi            $doc .= '</td>';
211f62ea8a1Sandi            $doc .= '</tr>';
212f62ea8a1Sandi        }
213c7b28ffdSAnika Henke        $doc .= '</tbody></table></div>';
214f62ea8a1Sandi        return $doc;
215f62ea8a1Sandi    }
216f62ea8a1Sandi
217f62ea8a1Sandi    /**
218f62ea8a1Sandi     * lists all known syntax modes and their sorting value
219253d4b48SGerrit Uitslag     *
220253d4b48SGerrit Uitslag     * @return string
221f62ea8a1Sandi     */
222957f36a6SAndreas Gohr    protected function renderSyntaxModes()
223957f36a6SAndreas Gohr    {
224f62ea8a1Sandi        $modes = p_get_parsermodes();
225f62ea8a1Sandi
22654cc7aa4SAndreas Gohr        $compactmodes = [];
227f62ea8a1Sandi        foreach ($modes as $mode) {
228a27c9d6fSGerrit Uitslag            $compactmodes[$mode['sort']][] = $mode['mode'];
229f62ea8a1Sandi        }
230a27c9d6fSGerrit Uitslag        $doc = '';
231a27c9d6fSGerrit Uitslag        $doc .= '<div class="table"><table class="inline"><tbody>';
232a27c9d6fSGerrit Uitslag
233a27c9d6fSGerrit Uitslag        foreach ($compactmodes as $sort => $modes) {
234a27c9d6fSGerrit Uitslag            $rowspan = '';
235a27c9d6fSGerrit Uitslag            if (count($modes) > 1) {
236a27c9d6fSGerrit Uitslag                $rowspan = ' rowspan="' . count($modes) . '"';
237a27c9d6fSGerrit Uitslag            }
238a27c9d6fSGerrit Uitslag
239a27c9d6fSGerrit Uitslag            foreach ($modes as $index => $mode) {
240a27c9d6fSGerrit Uitslag                $doc .= '<tr>';
241a27c9d6fSGerrit Uitslag                $doc .= '<td class="leftalign">';
242a27c9d6fSGerrit Uitslag                $doc .= $mode;
243a27c9d6fSGerrit Uitslag                $doc .= '</td>';
244a27c9d6fSGerrit Uitslag
245a27c9d6fSGerrit Uitslag                if ($index === 0) {
246a27c9d6fSGerrit Uitslag                    $doc .= '<td class="rightalign" ' . $rowspan . '>';
247a27c9d6fSGerrit Uitslag                    $doc .= $sort;
248a27c9d6fSGerrit Uitslag                    $doc .= '</td>';
249a27c9d6fSGerrit Uitslag                }
250a27c9d6fSGerrit Uitslag                $doc .= '</tr>';
251a27c9d6fSGerrit Uitslag            }
252a27c9d6fSGerrit Uitslag        }
253a27c9d6fSGerrit Uitslag
254a27c9d6fSGerrit Uitslag        $doc .= '</tbody></table></div>';
255f62ea8a1Sandi        return $doc;
256f62ea8a1Sandi    }
257c06c1c7aSEsther Brunner
258c06c1c7aSEsther Brunner    /**
259e9ac59e9SAndreas Gohr     * Render all currently registered event handlers
260e9ac59e9SAndreas Gohr     *
261e9ac59e9SAndreas Gohr     * @param Doku_Renderer $renderer
262e9ac59e9SAndreas Gohr     */
263e9ac59e9SAndreas Gohr    protected function renderHooks(Doku_Renderer $renderer)
264e9ac59e9SAndreas Gohr    {
265e9ac59e9SAndreas Gohr        global $EVENT_HANDLER;
266e9ac59e9SAndreas Gohr
267e9ac59e9SAndreas Gohr        $list = $EVENT_HANDLER->getEventHandlers();
268e9ac59e9SAndreas Gohr        ksort($list);
269e9ac59e9SAndreas Gohr
270e9ac59e9SAndreas Gohr        $renderer->listu_open();
271e9ac59e9SAndreas Gohr        foreach ($list as $event => $handlers) {
272e9ac59e9SAndreas Gohr            $renderer->listitem_open(1);
273e9ac59e9SAndreas Gohr            $renderer->listcontent_open();
274e9ac59e9SAndreas Gohr            $renderer->cdata($event);
275e9ac59e9SAndreas Gohr            $renderer->listcontent_close();
276e9ac59e9SAndreas Gohr
277e9ac59e9SAndreas Gohr            $renderer->listo_open();
278e9ac59e9SAndreas Gohr            foreach ($handlers as $sequence) {
279e9ac59e9SAndreas Gohr                foreach ($sequence as $handler) {
280e9ac59e9SAndreas Gohr                    $renderer->listitem_open(2);
281e9ac59e9SAndreas Gohr                    $renderer->listcontent_open();
282093fe67eSAndreas Gohr                    $renderer->cdata($handler[0]::class . '::' . $handler[1] . '()');
283e9ac59e9SAndreas Gohr                    $renderer->listcontent_close();
284e9ac59e9SAndreas Gohr                    $renderer->listitem_close();
285e9ac59e9SAndreas Gohr                }
286e9ac59e9SAndreas Gohr            }
287e9ac59e9SAndreas Gohr            $renderer->listo_close();
288e9ac59e9SAndreas Gohr            $renderer->listitem_close();
289e9ac59e9SAndreas Gohr        }
290e9ac59e9SAndreas Gohr        $renderer->listu_close();
291e9ac59e9SAndreas Gohr    }
292e9ac59e9SAndreas Gohr
293e9ac59e9SAndreas Gohr    /**
294c06c1c7aSEsther Brunner     * Adds a TOC item
29559bc3b48SGerrit Uitslag     *
29659bc3b48SGerrit Uitslag     * @param string $text
29759bc3b48SGerrit Uitslag     * @param int $level
29859bc3b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
29959bc3b48SGerrit Uitslag     * @return string
300c06c1c7aSEsther Brunner     */
301957f36a6SAndreas Gohr    protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer)
302957f36a6SAndreas Gohr    {
303c06c1c7aSEsther Brunner        global $conf;
304c06c1c7aSEsther Brunner
30559bc3b48SGerrit Uitslag        $hid = '';
306c06c1c7aSEsther Brunner        if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) {
307e0c26282SGerrit Uitslag            $hid = $renderer->_headerToLink($text, true);
30854cc7aa4SAndreas Gohr            $renderer->toc[] = [
309c06c1c7aSEsther Brunner                'hid' => $hid,
310c06c1c7aSEsther Brunner                'title' => $text,
311c06c1c7aSEsther Brunner                'type' => 'ul',
31254cc7aa4SAndreas Gohr                'level' => $level - $conf['toptoclevel'] + 1
31354cc7aa4SAndreas Gohr            ];
314c06c1c7aSEsther Brunner        }
315c06c1c7aSEsther Brunner        return $hid;
316c06c1c7aSEsther Brunner    }
317f62ea8a1Sandi}
318