xref: /dokuwiki/lib/plugins/info/syntax.php (revision 8788dbbd585b42284320d64cc932f3c875eab6b2)
1f62ea8a1Sandi<?php
245a30e7cSAndreas Gohr
3*8788dbbdSsplitbrainuse dokuwiki\Parsing\Handler;
48553d24dSAndreas Gohruse dokuwiki\Extension\SyntaxPlugin;
554cc7aa4SAndreas Gohruse dokuwiki\Extension\PluginInterface;
6560c6061SAndreas Gohruse dokuwiki\Parsing\ModeRegistry;
7d4f83172SAndreas Gohr
8f62ea8a1Sandi/**
9f62ea8a1Sandi * Info Plugin: Displays information about various DokuWiki internals
10f62ea8a1Sandi *
11f62ea8a1Sandi * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
12f62ea8a1Sandi * @author     Andreas Gohr <andi@splitbrain.org>
13c06c1c7aSEsther Brunner * @author     Esther Brunner <wikidesign@gmail.com>
14f62ea8a1Sandi */
158553d24dSAndreas Gohrclass syntax_plugin_info extends SyntaxPlugin
16957f36a6SAndreas Gohr{
17f62ea8a1Sandi    /**
18f62ea8a1Sandi     * What kind of syntax are we?
19f62ea8a1Sandi     */
20957f36a6SAndreas Gohr    public function getType()
21957f36a6SAndreas Gohr    {
22560c6061SAndreas Gohr        return ModeRegistry::CATEGORY_SUBSTITUTION;
23f62ea8a1Sandi    }
24f62ea8a1Sandi
25f62ea8a1Sandi    /**
26896a5c22Sandi     * What about paragraphs?
27896a5c22Sandi     */
28957f36a6SAndreas Gohr    public function getPType()
29957f36a6SAndreas Gohr    {
30896a5c22Sandi        return 'block';
31896a5c22Sandi    }
32896a5c22Sandi
33896a5c22Sandi    /**
34f62ea8a1Sandi     * Where to sort in?
35f62ea8a1Sandi     */
36957f36a6SAndreas Gohr    public function getSort()
37957f36a6SAndreas Gohr    {
38f62ea8a1Sandi        return 155;
39f62ea8a1Sandi    }
40f62ea8a1Sandi
41f62ea8a1Sandi    /**
42f62ea8a1Sandi     * Connect pattern to lexer
43f62ea8a1Sandi     */
44957f36a6SAndreas Gohr    public function connectTo($mode)
45957f36a6SAndreas Gohr    {
46f62ea8a1Sandi        $this->Lexer->addSpecialPattern('~~INFO:\w+~~', $mode, 'plugin_info');
47f62ea8a1Sandi    }
48f62ea8a1Sandi
49f62ea8a1Sandi    /**
50f62ea8a1Sandi     * Handle the match
51253d4b48SGerrit Uitslag     *
52253d4b48SGerrit Uitslag     * @param string $match The text matched by the patterns
53253d4b48SGerrit Uitslag     * @param int $state The lexer state for the match
54253d4b48SGerrit Uitslag     * @param int $pos The character position of the matched text
55*8788dbbdSsplitbrain     * @param Handler $handler The Doku_Handler object
56253d4b48SGerrit Uitslag     * @return  array Return an array with all data you want to use in render
57f62ea8a1Sandi     */
58*8788dbbdSsplitbrain    public function handle($match, $state, $pos, Handler $handler)
59957f36a6SAndreas Gohr    {
60f62ea8a1Sandi        $match = substr($match, 7, -2); //strip ~~INFO: from start and ~~ from end
6154cc7aa4SAndreas Gohr        return [strtolower($match)];
62f62ea8a1Sandi    }
63f62ea8a1Sandi
64f62ea8a1Sandi    /**
65f62ea8a1Sandi     * Create output
66253d4b48SGerrit Uitslag     *
67253d4b48SGerrit Uitslag     * @param string $format string     output format being rendered
68253d4b48SGerrit Uitslag     * @param Doku_Renderer $renderer the current renderer object
69253d4b48SGerrit Uitslag     * @param array $data data created by handler()
70253d4b48SGerrit Uitslag     * @return  boolean                 rendered correctly?
71f62ea8a1Sandi     */
72957f36a6SAndreas Gohr    public function render($format, Doku_Renderer $renderer, $data)
73957f36a6SAndreas Gohr    {
74f4e5a570Schris        if ($format == 'xhtml') {
7574ed54d4SGerrit Uitslag            /** @var Doku_Renderer_xhtml $renderer */
76f62ea8a1Sandi            //handle various info stuff
77093fe67eSAndreas Gohr            match ($data[0]) {
78093fe67eSAndreas Gohr                'syntaxmodes' => $renderer->doc .= $this->renderSyntaxModes(),
79093fe67eSAndreas Gohr                'syntaxtypes' => $renderer->doc .= $this->renderSyntaxTypes(),
80093fe67eSAndreas Gohr                'syntaxplugins' => $this->renderPlugins('syntax', $renderer),
81093fe67eSAndreas Gohr                'adminplugins' => $this->renderPlugins('admin', $renderer),
82093fe67eSAndreas Gohr                'actionplugins' => $this->renderPlugins('action', $renderer),
83093fe67eSAndreas Gohr                'rendererplugins' => $this->renderPlugins('renderer', $renderer),
84093fe67eSAndreas Gohr                'helperplugins' => $this->renderPlugins('helper', $renderer),
85093fe67eSAndreas Gohr                'authplugins' => $this->renderPlugins('auth', $renderer),
86093fe67eSAndreas Gohr                'remoteplugins' => $this->renderPlugins('remote', $renderer),
87093fe67eSAndreas Gohr                'helpermethods' => $this->renderHelperMethods($renderer),
88093fe67eSAndreas Gohr                'hooks' => $this->renderHooks($renderer),
89093fe67eSAndreas Gohr                'datetime' => $renderer->doc .= date('r'),
90093fe67eSAndreas Gohr                default => $renderer->doc .= "no info about " . htmlspecialchars($data[0]),
91093fe67eSAndreas Gohr            };
92f62ea8a1Sandi            return true;
93f62ea8a1Sandi        }
94f62ea8a1Sandi        return false;
95f62ea8a1Sandi    }
96f62ea8a1Sandi
97f62ea8a1Sandi    /**
98c06c1c7aSEsther Brunner     * list all installed plugins
99896a5c22Sandi     *
100896a5c22Sandi     * uses some of the original renderer methods
101253d4b48SGerrit Uitslag     *
102253d4b48SGerrit Uitslag     * @param string $type
1034baa5c86SAndreas Gohr     * @param Doku_Renderer $renderer
104896a5c22Sandi     */
1054baa5c86SAndreas Gohr    protected function renderPlugins($type, Doku_Renderer $renderer)
106957f36a6SAndreas Gohr    {
107896a5c22Sandi        global $lang;
108c06c1c7aSEsther Brunner        $plugins = plugin_list($type);
10954cc7aa4SAndreas Gohr        $plginfo = [];
1105f5f3ddcSAndreas Gohr
1115f5f3ddcSAndreas Gohr        // remove subparts
112896a5c22Sandi        foreach ($plugins as $p) {
11354cc7aa4SAndreas Gohr            $po = plugin_load($type, $p);
11454cc7aa4SAndreas Gohr            if (! $po instanceof PluginInterface) continue;
115a19c9aa0SGerrit Uitslag            [$name, /* part */] = explode('_', $p, 2);
1165f5f3ddcSAndreas Gohr            $plginfo[$name] = $po->getInfo();
1175f5f3ddcSAndreas Gohr        }
118896a5c22Sandi
1195f5f3ddcSAndreas Gohr        // list them
1204baa5c86SAndreas Gohr        $renderer->listu_open();
1215f5f3ddcSAndreas Gohr        foreach ($plginfo as $info) {
1224baa5c86SAndreas Gohr            $renderer->listitem_open(1);
1234baa5c86SAndreas Gohr            $renderer->listcontent_open();
124896a5c22Sandi            $renderer->externallink($info['url'], $info['name']);
1254baa5c86SAndreas Gohr            $renderer->cdata(' ');
1264baa5c86SAndreas Gohr            $renderer->emphasis_open();
1274baa5c86SAndreas Gohr            $renderer->cdata($info['date']);
1284baa5c86SAndreas Gohr            $renderer->emphasis_close();
1294baa5c86SAndreas Gohr            $renderer->cdata(' ' . $lang['by'] . ' ');
130896a5c22Sandi            $renderer->emaillink($info['email'], $info['author']);
1314baa5c86SAndreas Gohr            $renderer->linebreak();
1324baa5c86SAndreas Gohr            $renderer->cdata($info['desc']);
1334baa5c86SAndreas Gohr            $renderer->listcontent_close();
1344baa5c86SAndreas Gohr            $renderer->listitem_close();
135896a5c22Sandi        }
1364baa5c86SAndreas Gohr        $renderer->listu_close();
137896a5c22Sandi    }
138896a5c22Sandi
139896a5c22Sandi    /**
140c06c1c7aSEsther Brunner     * list all installed plugins
141c06c1c7aSEsther Brunner     *
142c06c1c7aSEsther Brunner     * uses some of the original renderer methods
143253d4b48SGerrit Uitslag     *
144253d4b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
145c06c1c7aSEsther Brunner     */
146957f36a6SAndreas Gohr    protected function renderHelperMethods(Doku_Renderer_xhtml $renderer)
147957f36a6SAndreas Gohr    {
148c06c1c7aSEsther Brunner        $plugins = plugin_list('helper');
149c06c1c7aSEsther Brunner        foreach ($plugins as $p) {
15054cc7aa4SAndreas Gohr            $po = plugin_load('helper', $p);
15154cc7aa4SAndreas Gohr            if (!$po instanceof PluginInterface) continue;
152c06c1c7aSEsther Brunner
153c06c1c7aSEsther Brunner            if (!method_exists($po, 'getMethods')) continue;
154c06c1c7aSEsther Brunner            $methods = $po->getMethods();
155c06c1c7aSEsther Brunner            $info = $po->getInfo();
156c06c1c7aSEsther Brunner
157957f36a6SAndreas Gohr            $hid = $this->addToToc($info['name'], 2, $renderer);
158c06c1c7aSEsther Brunner            $doc = '<h2><a name="' . $hid . '" id="' . $hid . '">' . hsc($info['name']) . '</a></h2>';
159c06c1c7aSEsther Brunner            $doc .= '<div class="level2">';
16054cc7aa4SAndreas Gohr            $doc .= '<p>' . strtr(hsc($info['desc']), ["\n" => "<br />"]) . '</p>';
1619b3b9e8eSGerrit Uitslag            $doc .= '<pre class="code">$' . $p . " = plugin_load('helper', '" . $p . "');</pre>";
162c06c1c7aSEsther Brunner            $doc .= '</div>';
163c06c1c7aSEsther Brunner            foreach ($methods as $method) {
164c06c1c7aSEsther Brunner                $title = '$' . $p . '->' . $method['name'] . '()';
165957f36a6SAndreas Gohr                $hid = $this->addToToc($title, 3, $renderer);
166c06c1c7aSEsther Brunner                $doc .= '<h3><a name="' . $hid . '" id="' . $hid . '">' . hsc($title) . '</a></h3>';
167c06c1c7aSEsther Brunner                $doc .= '<div class="level3">';
168c7b28ffdSAnika Henke                $doc .= '<div class="table"><table class="inline"><tbody>';
169c06c1c7aSEsther Brunner                $doc .= '<tr><th>Description</th><td colspan="2">' . $method['desc'] .
170c06c1c7aSEsther Brunner                    '</td></tr>';
171c06c1c7aSEsther Brunner                if ($method['params']) {
172c06c1c7aSEsther Brunner                    $c = count($method['params']);
173c06c1c7aSEsther Brunner                    $doc .= '<tr><th rowspan="' . $c . '">Parameters</th><td>';
17454cc7aa4SAndreas Gohr                    $params = [];
175c06c1c7aSEsther Brunner                    foreach ($method['params'] as $desc => $type) {
176c06c1c7aSEsther Brunner                        $params[] = hsc($desc) . '</td><td>' . hsc($type);
177c06c1c7aSEsther Brunner                    }
17854cc7aa4SAndreas Gohr                    $doc .= implode('</td></tr><tr><td>', $params) . '</td></tr>';
179c06c1c7aSEsther Brunner                }
180c06c1c7aSEsther Brunner                if ($method['return']) {
181c06c1c7aSEsther Brunner                    $doc .= '<tr><th>Return value</th><td>' . hsc(key($method['return'])) .
182c06c1c7aSEsther Brunner                        '</td><td>' . hsc(current($method['return'])) . '</td></tr>';
183c06c1c7aSEsther Brunner                }
184c7b28ffdSAnika Henke                $doc .= '</tbody></table></div>';
185c06c1c7aSEsther Brunner                $doc .= '</div>';
186c06c1c7aSEsther Brunner            }
187c06c1c7aSEsther Brunner            unset($po);
188c06c1c7aSEsther Brunner
189c06c1c7aSEsther Brunner            $renderer->doc .= $doc;
190c06c1c7aSEsther Brunner        }
191c06c1c7aSEsther Brunner    }
192c06c1c7aSEsther Brunner
193c06c1c7aSEsther Brunner    /**
194f62ea8a1Sandi     * lists all known syntax types and their registered modes
195253d4b48SGerrit Uitslag     *
196253d4b48SGerrit Uitslag     * @return string
197f62ea8a1Sandi     */
198957f36a6SAndreas Gohr    protected function renderSyntaxTypes()
199957f36a6SAndreas Gohr    {
200f62ea8a1Sandi        global $PARSER_MODES;
201f62ea8a1Sandi        $doc = '';
202f62ea8a1Sandi
203c7b28ffdSAnika Henke        $doc .= '<div class="table"><table class="inline"><tbody>';
204f62ea8a1Sandi        foreach ($PARSER_MODES as $mode => $modes) {
205f62ea8a1Sandi            $doc .= '<tr>';
206f62ea8a1Sandi            $doc .= '<td class="leftalign">';
207f62ea8a1Sandi            $doc .= $mode;
208f62ea8a1Sandi            $doc .= '</td>';
209f62ea8a1Sandi            $doc .= '<td class="leftalign">';
21054cc7aa4SAndreas Gohr            $doc .= implode(', ', $modes);
211f62ea8a1Sandi            $doc .= '</td>';
212f62ea8a1Sandi            $doc .= '</tr>';
213f62ea8a1Sandi        }
214c7b28ffdSAnika Henke        $doc .= '</tbody></table></div>';
215f62ea8a1Sandi        return $doc;
216f62ea8a1Sandi    }
217f62ea8a1Sandi
218f62ea8a1Sandi    /**
219f62ea8a1Sandi     * lists all known syntax modes and their sorting value
220253d4b48SGerrit Uitslag     *
221253d4b48SGerrit Uitslag     * @return string
222f62ea8a1Sandi     */
223957f36a6SAndreas Gohr    protected function renderSyntaxModes()
224957f36a6SAndreas Gohr    {
225f62ea8a1Sandi        $modes = p_get_parsermodes();
226f62ea8a1Sandi
22754cc7aa4SAndreas Gohr        $compactmodes = [];
228f62ea8a1Sandi        foreach ($modes as $mode) {
229a27c9d6fSGerrit Uitslag            $compactmodes[$mode['sort']][] = $mode['mode'];
230f62ea8a1Sandi        }
231a27c9d6fSGerrit Uitslag        $doc = '';
232a27c9d6fSGerrit Uitslag        $doc .= '<div class="table"><table class="inline"><tbody>';
233a27c9d6fSGerrit Uitslag
234a27c9d6fSGerrit Uitslag        foreach ($compactmodes as $sort => $modes) {
235a27c9d6fSGerrit Uitslag            $rowspan = '';
236a27c9d6fSGerrit Uitslag            if (count($modes) > 1) {
237a27c9d6fSGerrit Uitslag                $rowspan = ' rowspan="' . count($modes) . '"';
238a27c9d6fSGerrit Uitslag            }
239a27c9d6fSGerrit Uitslag
240a27c9d6fSGerrit Uitslag            foreach ($modes as $index => $mode) {
241a27c9d6fSGerrit Uitslag                $doc .= '<tr>';
242a27c9d6fSGerrit Uitslag                $doc .= '<td class="leftalign">';
243a27c9d6fSGerrit Uitslag                $doc .= $mode;
244a27c9d6fSGerrit Uitslag                $doc .= '</td>';
245a27c9d6fSGerrit Uitslag
246a27c9d6fSGerrit Uitslag                if ($index === 0) {
247a27c9d6fSGerrit Uitslag                    $doc .= '<td class="rightalign" ' . $rowspan . '>';
248a27c9d6fSGerrit Uitslag                    $doc .= $sort;
249a27c9d6fSGerrit Uitslag                    $doc .= '</td>';
250a27c9d6fSGerrit Uitslag                }
251a27c9d6fSGerrit Uitslag                $doc .= '</tr>';
252a27c9d6fSGerrit Uitslag            }
253a27c9d6fSGerrit Uitslag        }
254a27c9d6fSGerrit Uitslag
255a27c9d6fSGerrit Uitslag        $doc .= '</tbody></table></div>';
256f62ea8a1Sandi        return $doc;
257f62ea8a1Sandi    }
258c06c1c7aSEsther Brunner
259c06c1c7aSEsther Brunner    /**
260e9ac59e9SAndreas Gohr     * Render all currently registered event handlers
261e9ac59e9SAndreas Gohr     *
262e9ac59e9SAndreas Gohr     * @param Doku_Renderer $renderer
263e9ac59e9SAndreas Gohr     */
264e9ac59e9SAndreas Gohr    protected function renderHooks(Doku_Renderer $renderer)
265e9ac59e9SAndreas Gohr    {
266e9ac59e9SAndreas Gohr        global $EVENT_HANDLER;
267e9ac59e9SAndreas Gohr
268e9ac59e9SAndreas Gohr        $list = $EVENT_HANDLER->getEventHandlers();
269e9ac59e9SAndreas Gohr        ksort($list);
270e9ac59e9SAndreas Gohr
271e9ac59e9SAndreas Gohr        $renderer->listu_open();
272e9ac59e9SAndreas Gohr        foreach ($list as $event => $handlers) {
273e9ac59e9SAndreas Gohr            $renderer->listitem_open(1);
274e9ac59e9SAndreas Gohr            $renderer->listcontent_open();
275e9ac59e9SAndreas Gohr            $renderer->cdata($event);
276e9ac59e9SAndreas Gohr            $renderer->listcontent_close();
277e9ac59e9SAndreas Gohr
278e9ac59e9SAndreas Gohr            $renderer->listo_open();
279e9ac59e9SAndreas Gohr            foreach ($handlers as $sequence) {
280e9ac59e9SAndreas Gohr                foreach ($sequence as $handler) {
281e9ac59e9SAndreas Gohr                    $renderer->listitem_open(2);
282e9ac59e9SAndreas Gohr                    $renderer->listcontent_open();
283093fe67eSAndreas Gohr                    $renderer->cdata($handler[0]::class . '::' . $handler[1] . '()');
284e9ac59e9SAndreas Gohr                    $renderer->listcontent_close();
285e9ac59e9SAndreas Gohr                    $renderer->listitem_close();
286e9ac59e9SAndreas Gohr                }
287e9ac59e9SAndreas Gohr            }
288e9ac59e9SAndreas Gohr            $renderer->listo_close();
289e9ac59e9SAndreas Gohr            $renderer->listitem_close();
290e9ac59e9SAndreas Gohr        }
291e9ac59e9SAndreas Gohr        $renderer->listu_close();
292e9ac59e9SAndreas Gohr    }
293e9ac59e9SAndreas Gohr
294e9ac59e9SAndreas Gohr    /**
295c06c1c7aSEsther Brunner     * Adds a TOC item
29659bc3b48SGerrit Uitslag     *
29759bc3b48SGerrit Uitslag     * @param string $text
29859bc3b48SGerrit Uitslag     * @param int $level
29959bc3b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
30059bc3b48SGerrit Uitslag     * @return string
301c06c1c7aSEsther Brunner     */
302957f36a6SAndreas Gohr    protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer)
303957f36a6SAndreas Gohr    {
304c06c1c7aSEsther Brunner        global $conf;
305c06c1c7aSEsther Brunner
30659bc3b48SGerrit Uitslag        $hid = '';
307c06c1c7aSEsther Brunner        if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) {
308e0c26282SGerrit Uitslag            $hid = $renderer->_headerToLink($text, true);
30954cc7aa4SAndreas Gohr            $renderer->toc[] = [
310c06c1c7aSEsther Brunner                'hid' => $hid,
311c06c1c7aSEsther Brunner                'title' => $text,
312c06c1c7aSEsther Brunner                'type' => 'ul',
31354cc7aa4SAndreas Gohr                'level' => $level - $conf['toptoclevel'] + 1
31454cc7aa4SAndreas Gohr            ];
315c06c1c7aSEsther Brunner        }
316c06c1c7aSEsther Brunner        return $hid;
317c06c1c7aSEsther Brunner    }
318f62ea8a1Sandi}
319