xref: /dokuwiki/lib/plugins/info/syntax.php (revision 4baa5c86c66670cc9da4a6454b8421dfe68eed1f)
1f62ea8a1Sandi<?php
245a30e7cSAndreas Gohr
3f62ea8a1Sandi/**
4f62ea8a1Sandi * Info Plugin: Displays information about various DokuWiki internals
5f62ea8a1Sandi *
6f62ea8a1Sandi * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
7f62ea8a1Sandi * @author     Andreas Gohr <andi@splitbrain.org>
8c06c1c7aSEsther Brunner * @author     Esther Brunner <wikidesign@gmail.com>
9f62ea8a1Sandi */
10957f36a6SAndreas Gohrclass syntax_plugin_info extends DokuWiki_Syntax_Plugin
11957f36a6SAndreas Gohr{
12f62ea8a1Sandi
13f62ea8a1Sandi    /**
14f62ea8a1Sandi     * What kind of syntax are we?
15f62ea8a1Sandi     */
16957f36a6SAndreas Gohr    public function getType()
17957f36a6SAndreas Gohr    {
18f62ea8a1Sandi        return 'substition';
19f62ea8a1Sandi    }
20f62ea8a1Sandi
21f62ea8a1Sandi    /**
22896a5c22Sandi     * What about paragraphs?
23896a5c22Sandi     */
24957f36a6SAndreas Gohr    public function getPType()
25957f36a6SAndreas Gohr    {
26896a5c22Sandi        return 'block';
27896a5c22Sandi    }
28896a5c22Sandi
29896a5c22Sandi    /**
30f62ea8a1Sandi     * Where to sort in?
31f62ea8a1Sandi     */
32957f36a6SAndreas Gohr    public function getSort()
33957f36a6SAndreas Gohr    {
34f62ea8a1Sandi        return 155;
35f62ea8a1Sandi    }
36f62ea8a1Sandi
37f62ea8a1Sandi    /**
38f62ea8a1Sandi     * Connect pattern to lexer
39f62ea8a1Sandi     */
40957f36a6SAndreas Gohr    public function connectTo($mode)
41957f36a6SAndreas Gohr    {
42f62ea8a1Sandi        $this->Lexer->addSpecialPattern('~~INFO:\w+~~', $mode, 'plugin_info');
43f62ea8a1Sandi    }
44f62ea8a1Sandi
45f62ea8a1Sandi    /**
46f62ea8a1Sandi     * Handle the match
47253d4b48SGerrit Uitslag     *
48253d4b48SGerrit Uitslag     * @param string $match The text matched by the patterns
49253d4b48SGerrit Uitslag     * @param int $state The lexer state for the match
50253d4b48SGerrit Uitslag     * @param int $pos The character position of the matched text
51253d4b48SGerrit Uitslag     * @param Doku_Handler $handler The Doku_Handler object
52253d4b48SGerrit Uitslag     * @return  array Return an array with all data you want to use in render
53f62ea8a1Sandi     */
54957f36a6SAndreas Gohr    public function handle($match, $state, $pos, Doku_Handler $handler)
55957f36a6SAndreas Gohr    {
56f62ea8a1Sandi        $match = substr($match, 7, -2); //strip ~~INFO: from start and ~~ from end
57f62ea8a1Sandi        return array(strtolower($match));
58f62ea8a1Sandi    }
59f62ea8a1Sandi
60f62ea8a1Sandi    /**
61f62ea8a1Sandi     * Create output
62253d4b48SGerrit Uitslag     *
63253d4b48SGerrit Uitslag     * @param string $format string     output format being rendered
64253d4b48SGerrit Uitslag     * @param Doku_Renderer $renderer the current renderer object
65253d4b48SGerrit Uitslag     * @param array $data data created by handler()
66253d4b48SGerrit Uitslag     * @return  boolean                 rendered correctly?
67f62ea8a1Sandi     */
68957f36a6SAndreas Gohr    public function render($format, Doku_Renderer $renderer, $data)
69957f36a6SAndreas Gohr    {
70f4e5a570Schris        if ($format == 'xhtml') {
7174ed54d4SGerrit Uitslag            /** @var Doku_Renderer_xhtml $renderer */
72f62ea8a1Sandi            //handle various info stuff
73f62ea8a1Sandi            switch ($data[0]) {
74896a5c22Sandi                case 'syntaxmodes':
75957f36a6SAndreas Gohr                    $renderer->doc .= $this->renderSyntaxModes();
76f62ea8a1Sandi                    break;
77896a5c22Sandi                case 'syntaxtypes':
78957f36a6SAndreas Gohr                    $renderer->doc .= $this->renderSyntaxTypes();
79f62ea8a1Sandi                    break;
80896a5c22Sandi                case 'syntaxplugins':
81957f36a6SAndreas Gohr                    $this->renderPlugins('syntax', $renderer);
82c06c1c7aSEsther Brunner                    break;
83c06c1c7aSEsther Brunner                case 'adminplugins':
84957f36a6SAndreas Gohr                    $this->renderPlugins('admin', $renderer);
85c06c1c7aSEsther Brunner                    break;
86c06c1c7aSEsther Brunner                case 'actionplugins':
87957f36a6SAndreas Gohr                    $this->renderPlugins('action', $renderer);
88c06c1c7aSEsther Brunner                    break;
89c06c1c7aSEsther Brunner                case 'rendererplugins':
90957f36a6SAndreas Gohr                    $this->renderPlugins('renderer', $renderer);
91c06c1c7aSEsther Brunner                    break;
92c06c1c7aSEsther Brunner                case 'helperplugins':
93957f36a6SAndreas Gohr                    $this->renderPlugins('helper', $renderer);
94c06c1c7aSEsther Brunner                    break;
95603a6381SKlap-in                case 'authplugins':
96957f36a6SAndreas Gohr                    $this->renderPlugins('auth', $renderer);
97603a6381SKlap-in                    break;
98603a6381SKlap-in                case 'remoteplugins':
99957f36a6SAndreas Gohr                    $this->renderPlugins('remote', $renderer);
100603a6381SKlap-in                    break;
101c06c1c7aSEsther Brunner                case 'helpermethods':
102957f36a6SAndreas Gohr                    $this->renderHelperMethods($renderer);
103896a5c22Sandi                    break;
104e9ac59e9SAndreas Gohr                case 'hooks':
105e9ac59e9SAndreas Gohr                    $this->renderHooks($renderer);
106e9ac59e9SAndreas Gohr                    break;
1077210c855SAndreas Gohr                case 'datetime':
1087210c855SAndreas Gohr                    $renderer->doc .= date('r');
1097210c855SAndreas Gohr                    break;
110f62ea8a1Sandi                default:
111f62ea8a1Sandi                    $renderer->doc .= "no info about " . htmlspecialchars($data[0]);
112f62ea8a1Sandi            }
113f62ea8a1Sandi            return true;
114f62ea8a1Sandi        }
115f62ea8a1Sandi        return false;
116f62ea8a1Sandi    }
117f62ea8a1Sandi
118f62ea8a1Sandi    /**
119c06c1c7aSEsther Brunner     * list all installed plugins
120896a5c22Sandi     *
121896a5c22Sandi     * uses some of the original renderer methods
122253d4b48SGerrit Uitslag     *
123253d4b48SGerrit Uitslag     * @param string $type
124*4baa5c86SAndreas Gohr     * @param Doku_Renderer $renderer
125896a5c22Sandi     */
126*4baa5c86SAndreas Gohr    protected function renderPlugins($type, Doku_Renderer $renderer)
127957f36a6SAndreas Gohr    {
128896a5c22Sandi        global $lang;
129c06c1c7aSEsther Brunner        $plugins = plugin_list($type);
1305f5f3ddcSAndreas Gohr        $plginfo = array();
1315f5f3ddcSAndreas Gohr
1325f5f3ddcSAndreas Gohr        // remove subparts
133896a5c22Sandi        foreach ($plugins as $p) {
1349b3b9e8eSGerrit Uitslag            if (!$po = plugin_load($type, $p)) continue;
135253d4b48SGerrit Uitslag            list($name,/* $part */) = explode('_', $p, 2);
1365f5f3ddcSAndreas Gohr            $plginfo[$name] = $po->getInfo();
1375f5f3ddcSAndreas Gohr        }
138896a5c22Sandi
1395f5f3ddcSAndreas Gohr        // list them
140*4baa5c86SAndreas Gohr        $renderer->listu_open();
1415f5f3ddcSAndreas Gohr        foreach ($plginfo as $info) {
142*4baa5c86SAndreas Gohr            $renderer->listitem_open(1);
143*4baa5c86SAndreas Gohr            $renderer->listcontent_open();
144896a5c22Sandi            $renderer->externallink($info['url'], $info['name']);
145*4baa5c86SAndreas Gohr            $renderer->cdata(' ');
146*4baa5c86SAndreas Gohr            $renderer->emphasis_open();
147*4baa5c86SAndreas Gohr            $renderer->cdata($info['date']);
148*4baa5c86SAndreas Gohr            $renderer->emphasis_close();
149*4baa5c86SAndreas Gohr            $renderer->cdata(' ' . $lang['by'] . ' ');
150896a5c22Sandi            $renderer->emaillink($info['email'], $info['author']);
151*4baa5c86SAndreas Gohr            $renderer->linebreak();
152*4baa5c86SAndreas Gohr            $renderer->cdata($info['desc']);
153*4baa5c86SAndreas Gohr            $renderer->listcontent_close();
154*4baa5c86SAndreas Gohr            $renderer->listitem_close();
155896a5c22Sandi        }
156*4baa5c86SAndreas Gohr        $renderer->listu_close();
157896a5c22Sandi    }
158896a5c22Sandi
159896a5c22Sandi    /**
160c06c1c7aSEsther Brunner     * list all installed plugins
161c06c1c7aSEsther Brunner     *
162c06c1c7aSEsther Brunner     * uses some of the original renderer methods
163253d4b48SGerrit Uitslag     *
164253d4b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
165c06c1c7aSEsther Brunner     */
166957f36a6SAndreas Gohr    protected function renderHelperMethods(Doku_Renderer_xhtml $renderer)
167957f36a6SAndreas Gohr    {
168c06c1c7aSEsther Brunner        $plugins = plugin_list('helper');
169c06c1c7aSEsther Brunner        foreach ($plugins as $p) {
1709b3b9e8eSGerrit Uitslag            if (!$po = plugin_load('helper', $p)) continue;
171c06c1c7aSEsther Brunner
172c06c1c7aSEsther Brunner            if (!method_exists($po, 'getMethods')) continue;
173c06c1c7aSEsther Brunner            $methods = $po->getMethods();
174c06c1c7aSEsther Brunner            $info = $po->getInfo();
175c06c1c7aSEsther Brunner
176957f36a6SAndreas Gohr            $hid = $this->addToToc($info['name'], 2, $renderer);
177c06c1c7aSEsther Brunner            $doc = '<h2><a name="' . $hid . '" id="' . $hid . '">' . hsc($info['name']) . '</a></h2>';
178c06c1c7aSEsther Brunner            $doc .= '<div class="level2">';
179c06c1c7aSEsther Brunner            $doc .= '<p>' . strtr(hsc($info['desc']), array("\n" => "<br />")) . '</p>';
1809b3b9e8eSGerrit Uitslag            $doc .= '<pre class="code">$' . $p . " = plugin_load('helper', '" . $p . "');</pre>";
181c06c1c7aSEsther Brunner            $doc .= '</div>';
182c06c1c7aSEsther Brunner            foreach ($methods as $method) {
183c06c1c7aSEsther Brunner                $title = '$' . $p . '->' . $method['name'] . '()';
184957f36a6SAndreas Gohr                $hid = $this->addToToc($title, 3, $renderer);
185c06c1c7aSEsther Brunner                $doc .= '<h3><a name="' . $hid . '" id="' . $hid . '">' . hsc($title) . '</a></h3>';
186c06c1c7aSEsther Brunner                $doc .= '<div class="level3">';
187c7b28ffdSAnika Henke                $doc .= '<div class="table"><table class="inline"><tbody>';
188c06c1c7aSEsther Brunner                $doc .= '<tr><th>Description</th><td colspan="2">' . $method['desc'] .
189c06c1c7aSEsther Brunner                    '</td></tr>';
190c06c1c7aSEsther Brunner                if ($method['params']) {
191c06c1c7aSEsther Brunner                    $c = count($method['params']);
192c06c1c7aSEsther Brunner                    $doc .= '<tr><th rowspan="' . $c . '">Parameters</th><td>';
193c06c1c7aSEsther Brunner                    $params = array();
194c06c1c7aSEsther Brunner                    foreach ($method['params'] as $desc => $type) {
195c06c1c7aSEsther Brunner                        $params[] = hsc($desc) . '</td><td>' . hsc($type);
196c06c1c7aSEsther Brunner                    }
1975312cb0bSSyntaxseed                    $doc .= join('</td></tr><tr><td>', $params) . '</td></tr>';
198c06c1c7aSEsther Brunner                }
199c06c1c7aSEsther Brunner                if ($method['return']) {
200c06c1c7aSEsther Brunner                    $doc .= '<tr><th>Return value</th><td>' . hsc(key($method['return'])) .
201c06c1c7aSEsther Brunner                        '</td><td>' . hsc(current($method['return'])) . '</td></tr>';
202c06c1c7aSEsther Brunner                }
203c7b28ffdSAnika Henke                $doc .= '</tbody></table></div>';
204c06c1c7aSEsther Brunner                $doc .= '</div>';
205c06c1c7aSEsther Brunner            }
206c06c1c7aSEsther Brunner            unset($po);
207c06c1c7aSEsther Brunner
208c06c1c7aSEsther Brunner            $renderer->doc .= $doc;
209c06c1c7aSEsther Brunner        }
210c06c1c7aSEsther Brunner    }
211c06c1c7aSEsther Brunner
212c06c1c7aSEsther Brunner    /**
213f62ea8a1Sandi     * lists all known syntax types and their registered modes
214253d4b48SGerrit Uitslag     *
215253d4b48SGerrit Uitslag     * @return string
216f62ea8a1Sandi     */
217957f36a6SAndreas Gohr    protected function renderSyntaxTypes()
218957f36a6SAndreas Gohr    {
219f62ea8a1Sandi        global $PARSER_MODES;
220f62ea8a1Sandi        $doc = '';
221f62ea8a1Sandi
222c7b28ffdSAnika Henke        $doc .= '<div class="table"><table class="inline"><tbody>';
223f62ea8a1Sandi        foreach ($PARSER_MODES as $mode => $modes) {
224f62ea8a1Sandi            $doc .= '<tr>';
225f62ea8a1Sandi            $doc .= '<td class="leftalign">';
226f62ea8a1Sandi            $doc .= $mode;
227f62ea8a1Sandi            $doc .= '</td>';
228f62ea8a1Sandi            $doc .= '<td class="leftalign">';
229f62ea8a1Sandi            $doc .= join(', ', $modes);
230f62ea8a1Sandi            $doc .= '</td>';
231f62ea8a1Sandi            $doc .= '</tr>';
232f62ea8a1Sandi        }
233c7b28ffdSAnika Henke        $doc .= '</tbody></table></div>';
234f62ea8a1Sandi        return $doc;
235f62ea8a1Sandi    }
236f62ea8a1Sandi
237f62ea8a1Sandi    /**
238f62ea8a1Sandi     * lists all known syntax modes and their sorting value
239253d4b48SGerrit Uitslag     *
240253d4b48SGerrit Uitslag     * @return string
241f62ea8a1Sandi     */
242957f36a6SAndreas Gohr    protected function renderSyntaxModes()
243957f36a6SAndreas Gohr    {
244f62ea8a1Sandi        $modes = p_get_parsermodes();
245f62ea8a1Sandi
246a27c9d6fSGerrit Uitslag        $compactmodes = array();
247f62ea8a1Sandi        foreach ($modes as $mode) {
248a27c9d6fSGerrit Uitslag            $compactmodes[$mode['sort']][] = $mode['mode'];
249f62ea8a1Sandi        }
250a27c9d6fSGerrit Uitslag        $doc = '';
251a27c9d6fSGerrit Uitslag        $doc .= '<div class="table"><table class="inline"><tbody>';
252a27c9d6fSGerrit Uitslag
253a27c9d6fSGerrit Uitslag        foreach ($compactmodes as $sort => $modes) {
254a27c9d6fSGerrit Uitslag            $rowspan = '';
255a27c9d6fSGerrit Uitslag            if (count($modes) > 1) {
256a27c9d6fSGerrit Uitslag                $rowspan = ' rowspan="' . count($modes) . '"';
257a27c9d6fSGerrit Uitslag            }
258a27c9d6fSGerrit Uitslag
259a27c9d6fSGerrit Uitslag            foreach ($modes as $index => $mode) {
260a27c9d6fSGerrit Uitslag                $doc .= '<tr>';
261a27c9d6fSGerrit Uitslag                $doc .= '<td class="leftalign">';
262a27c9d6fSGerrit Uitslag                $doc .= $mode;
263a27c9d6fSGerrit Uitslag                $doc .= '</td>';
264a27c9d6fSGerrit Uitslag
265a27c9d6fSGerrit Uitslag                if ($index === 0) {
266a27c9d6fSGerrit Uitslag                    $doc .= '<td class="rightalign" ' . $rowspan . '>';
267a27c9d6fSGerrit Uitslag                    $doc .= $sort;
268a27c9d6fSGerrit Uitslag                    $doc .= '</td>';
269a27c9d6fSGerrit Uitslag                }
270a27c9d6fSGerrit Uitslag                $doc .= '</tr>';
271a27c9d6fSGerrit Uitslag            }
272a27c9d6fSGerrit Uitslag        }
273a27c9d6fSGerrit Uitslag
274a27c9d6fSGerrit Uitslag        $doc .= '</tbody></table></div>';
275f62ea8a1Sandi        return $doc;
276f62ea8a1Sandi    }
277c06c1c7aSEsther Brunner
278c06c1c7aSEsther Brunner    /**
279e9ac59e9SAndreas Gohr     * Render all currently registered event handlers
280e9ac59e9SAndreas Gohr     *
281e9ac59e9SAndreas Gohr     * @param Doku_Renderer $renderer
282e9ac59e9SAndreas Gohr     */
283e9ac59e9SAndreas Gohr    protected function renderHooks(Doku_Renderer $renderer)
284e9ac59e9SAndreas Gohr    {
285e9ac59e9SAndreas Gohr        global $EVENT_HANDLER;
286e9ac59e9SAndreas Gohr
287e9ac59e9SAndreas Gohr        $list = $EVENT_HANDLER->getEventHandlers();
288e9ac59e9SAndreas Gohr        ksort($list);
289e9ac59e9SAndreas Gohr
290e9ac59e9SAndreas Gohr        $renderer->listu_open();
291e9ac59e9SAndreas Gohr        foreach ($list as $event => $handlers) {
292e9ac59e9SAndreas Gohr            $renderer->listitem_open(1);
293e9ac59e9SAndreas Gohr            $renderer->listcontent_open();
294e9ac59e9SAndreas Gohr            $renderer->cdata($event);
295e9ac59e9SAndreas Gohr            $renderer->listcontent_close();
296e9ac59e9SAndreas Gohr
297e9ac59e9SAndreas Gohr            $renderer->listo_open();
298e9ac59e9SAndreas Gohr            foreach ($handlers as $sequence) {
299e9ac59e9SAndreas Gohr                foreach ($sequence as $handler) {
300e9ac59e9SAndreas Gohr                    $renderer->listitem_open(2);
301e9ac59e9SAndreas Gohr                    $renderer->listcontent_open();
302e9ac59e9SAndreas Gohr                    $renderer->cdata(get_class($handler[0]) . '::' . $handler[1] . '()');
303e9ac59e9SAndreas Gohr                    $renderer->listcontent_close();
304e9ac59e9SAndreas Gohr                    $renderer->listitem_close();
305e9ac59e9SAndreas Gohr                }
306e9ac59e9SAndreas Gohr            }
307e9ac59e9SAndreas Gohr            $renderer->listo_close();
308e9ac59e9SAndreas Gohr            $renderer->listitem_close();
309e9ac59e9SAndreas Gohr        }
310e9ac59e9SAndreas Gohr        $renderer->listu_close();
311e9ac59e9SAndreas Gohr    }
312e9ac59e9SAndreas Gohr
313e9ac59e9SAndreas Gohr    /**
314c06c1c7aSEsther Brunner     * Adds a TOC item
31559bc3b48SGerrit Uitslag     *
31659bc3b48SGerrit Uitslag     * @param string $text
31759bc3b48SGerrit Uitslag     * @param int $level
31859bc3b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
31959bc3b48SGerrit Uitslag     * @return string
320c06c1c7aSEsther Brunner     */
321957f36a6SAndreas Gohr    protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer)
322957f36a6SAndreas Gohr    {
323c06c1c7aSEsther Brunner        global $conf;
324c06c1c7aSEsther Brunner
32559bc3b48SGerrit Uitslag        $hid = '';
326c06c1c7aSEsther Brunner        if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) {
327e0c26282SGerrit Uitslag            $hid = $renderer->_headerToLink($text, true);
328c06c1c7aSEsther Brunner            $renderer->toc[] = array(
329c06c1c7aSEsther Brunner                'hid' => $hid,
330c06c1c7aSEsther Brunner                'title' => $text,
331c06c1c7aSEsther Brunner                'type' => 'ul',
33245a30e7cSAndreas Gohr                'level' => $level - $conf['toptoclevel'] + 1,
333c06c1c7aSEsther Brunner            );
334c06c1c7aSEsther Brunner        }
335c06c1c7aSEsther Brunner        return $hid;
336c06c1c7aSEsther Brunner    }
337f62ea8a1Sandi}
338