xref: /dokuwiki/lib/plugins/info/syntax.php (revision 1ed5d398b41cff101dab6090bc83994760bee156)
1f62ea8a1Sandi<?php
245a30e7cSAndreas Gohr
38788dbbdSsplitbrainuse 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
558788dbbdSsplitbrain     * @param Handler $handler The Doku_Handler object
56253d4b48SGerrit Uitslag     * @return  array Return an array with all data you want to use in render
57f62ea8a1Sandi     */
588788dbbdSsplitbrain    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    {
2002d05a06dSAndreas Gohr        global $conf;
201f62ea8a1Sandi
2022d05a06dSAndreas Gohr        $registry = new ModeRegistry($conf['syntax']);
2032d05a06dSAndreas Gohr        $registry->getModes();
204*1ed5d398Ssplitbrain
2052d05a06dSAndreas Gohr        $categories = $registry->getCategories();
2062d05a06dSAndreas Gohr
2072d05a06dSAndreas Gohr        $doc = '';
208c7b28ffdSAnika Henke        $doc .= '<div class="table"><table class="inline"><tbody>';
2092d05a06dSAndreas Gohr        foreach ($categories as $type => $modes) {
210f62ea8a1Sandi            $doc .= '<tr>';
211f62ea8a1Sandi            $doc .= '<td class="leftalign">';
2122d05a06dSAndreas Gohr            $doc .= $type;
213f62ea8a1Sandi            $doc .= '</td>';
214f62ea8a1Sandi            $doc .= '<td class="leftalign">';
21554cc7aa4SAndreas Gohr            $doc .= implode(', ', $modes);
216f62ea8a1Sandi            $doc .= '</td>';
217f62ea8a1Sandi            $doc .= '</tr>';
218f62ea8a1Sandi        }
219c7b28ffdSAnika Henke        $doc .= '</tbody></table></div>';
220f62ea8a1Sandi        return $doc;
221f62ea8a1Sandi    }
222f62ea8a1Sandi
223f62ea8a1Sandi    /**
224f62ea8a1Sandi     * lists all known syntax modes and their sorting value
225253d4b48SGerrit Uitslag     *
226253d4b48SGerrit Uitslag     * @return string
227f62ea8a1Sandi     */
228957f36a6SAndreas Gohr    protected function renderSyntaxModes()
229957f36a6SAndreas Gohr    {
2302d05a06dSAndreas Gohr        global $conf;
2312d05a06dSAndreas Gohr        $modes = (new ModeRegistry($conf['syntax']))->getModes();
232f62ea8a1Sandi
23354cc7aa4SAndreas Gohr        $compactmodes = [];
234f62ea8a1Sandi        foreach ($modes as $mode) {
235a27c9d6fSGerrit Uitslag            $compactmodes[$mode['sort']][] = $mode['mode'];
236f62ea8a1Sandi        }
237a27c9d6fSGerrit Uitslag        $doc = '';
238a27c9d6fSGerrit Uitslag        $doc .= '<div class="table"><table class="inline"><tbody>';
239a27c9d6fSGerrit Uitslag
240a27c9d6fSGerrit Uitslag        foreach ($compactmodes as $sort => $modes) {
241a27c9d6fSGerrit Uitslag            $rowspan = '';
242a27c9d6fSGerrit Uitslag            if (count($modes) > 1) {
243a27c9d6fSGerrit Uitslag                $rowspan = ' rowspan="' . count($modes) . '"';
244a27c9d6fSGerrit Uitslag            }
245a27c9d6fSGerrit Uitslag
246a27c9d6fSGerrit Uitslag            foreach ($modes as $index => $mode) {
247a27c9d6fSGerrit Uitslag                $doc .= '<tr>';
248a27c9d6fSGerrit Uitslag                $doc .= '<td class="leftalign">';
249a27c9d6fSGerrit Uitslag                $doc .= $mode;
250a27c9d6fSGerrit Uitslag                $doc .= '</td>';
251a27c9d6fSGerrit Uitslag
252a27c9d6fSGerrit Uitslag                if ($index === 0) {
253a27c9d6fSGerrit Uitslag                    $doc .= '<td class="rightalign" ' . $rowspan . '>';
254a27c9d6fSGerrit Uitslag                    $doc .= $sort;
255a27c9d6fSGerrit Uitslag                    $doc .= '</td>';
256a27c9d6fSGerrit Uitslag                }
257a27c9d6fSGerrit Uitslag                $doc .= '</tr>';
258a27c9d6fSGerrit Uitslag            }
259a27c9d6fSGerrit Uitslag        }
260a27c9d6fSGerrit Uitslag
261a27c9d6fSGerrit Uitslag        $doc .= '</tbody></table></div>';
262f62ea8a1Sandi        return $doc;
263f62ea8a1Sandi    }
264c06c1c7aSEsther Brunner
265c06c1c7aSEsther Brunner    /**
266e9ac59e9SAndreas Gohr     * Render all currently registered event handlers
267e9ac59e9SAndreas Gohr     *
268e9ac59e9SAndreas Gohr     * @param Doku_Renderer $renderer
269e9ac59e9SAndreas Gohr     */
270e9ac59e9SAndreas Gohr    protected function renderHooks(Doku_Renderer $renderer)
271e9ac59e9SAndreas Gohr    {
272e9ac59e9SAndreas Gohr        global $EVENT_HANDLER;
273e9ac59e9SAndreas Gohr
274e9ac59e9SAndreas Gohr        $list = $EVENT_HANDLER->getEventHandlers();
275e9ac59e9SAndreas Gohr        ksort($list);
276e9ac59e9SAndreas Gohr
277e9ac59e9SAndreas Gohr        $renderer->listu_open();
278e9ac59e9SAndreas Gohr        foreach ($list as $event => $handlers) {
279e9ac59e9SAndreas Gohr            $renderer->listitem_open(1);
280e9ac59e9SAndreas Gohr            $renderer->listcontent_open();
281e9ac59e9SAndreas Gohr            $renderer->cdata($event);
282e9ac59e9SAndreas Gohr            $renderer->listcontent_close();
283e9ac59e9SAndreas Gohr
284e9ac59e9SAndreas Gohr            $renderer->listo_open();
285e9ac59e9SAndreas Gohr            foreach ($handlers as $sequence) {
286e9ac59e9SAndreas Gohr                foreach ($sequence as $handler) {
287e9ac59e9SAndreas Gohr                    $renderer->listitem_open(2);
288e9ac59e9SAndreas Gohr                    $renderer->listcontent_open();
289093fe67eSAndreas Gohr                    $renderer->cdata($handler[0]::class . '::' . $handler[1] . '()');
290e9ac59e9SAndreas Gohr                    $renderer->listcontent_close();
291e9ac59e9SAndreas Gohr                    $renderer->listitem_close();
292e9ac59e9SAndreas Gohr                }
293e9ac59e9SAndreas Gohr            }
294e9ac59e9SAndreas Gohr            $renderer->listo_close();
295e9ac59e9SAndreas Gohr            $renderer->listitem_close();
296e9ac59e9SAndreas Gohr        }
297e9ac59e9SAndreas Gohr        $renderer->listu_close();
298e9ac59e9SAndreas Gohr    }
299e9ac59e9SAndreas Gohr
300e9ac59e9SAndreas Gohr    /**
301c06c1c7aSEsther Brunner     * Adds a TOC item
30259bc3b48SGerrit Uitslag     *
30359bc3b48SGerrit Uitslag     * @param string $text
30459bc3b48SGerrit Uitslag     * @param int $level
30559bc3b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
30659bc3b48SGerrit Uitslag     * @return string
307c06c1c7aSEsther Brunner     */
308957f36a6SAndreas Gohr    protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer)
309957f36a6SAndreas Gohr    {
310c06c1c7aSEsther Brunner        global $conf;
311c06c1c7aSEsther Brunner
31259bc3b48SGerrit Uitslag        $hid = '';
313c06c1c7aSEsther Brunner        if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) {
314e0c26282SGerrit Uitslag            $hid = $renderer->_headerToLink($text, true);
31554cc7aa4SAndreas Gohr            $renderer->toc[] = [
316c06c1c7aSEsther Brunner                'hid' => $hid,
317c06c1c7aSEsther Brunner                'title' => $text,
318c06c1c7aSEsther Brunner                'type' => 'ul',
31954cc7aa4SAndreas Gohr                'level' => $level - $conf['toptoclevel'] + 1
32054cc7aa4SAndreas Gohr            ];
321c06c1c7aSEsther Brunner        }
322c06c1c7aSEsther Brunner        return $hid;
323c06c1c7aSEsther Brunner    }
324f62ea8a1Sandi}
325