xref: /dokuwiki/lib/plugins/info/syntax.php (revision 7210c855fdb7593ea053c2195b8a06d1660e0049)
1f62ea8a1Sandi<?php
2f62ea8a1Sandi/**
3f62ea8a1Sandi * Info Plugin: Displays information about various DokuWiki internals
4f62ea8a1Sandi *
5f62ea8a1Sandi * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6f62ea8a1Sandi * @author     Andreas Gohr <andi@splitbrain.org>
7c06c1c7aSEsther Brunner * @author     Esther Brunner <wikidesign@gmail.com>
8f62ea8a1Sandi */
9957f36a6SAndreas Gohrclass syntax_plugin_info extends DokuWiki_Syntax_Plugin
10957f36a6SAndreas Gohr{
11f62ea8a1Sandi
12f62ea8a1Sandi    /**
13f62ea8a1Sandi     * What kind of syntax are we?
14f62ea8a1Sandi     */
15957f36a6SAndreas Gohr    public function getType()
16957f36a6SAndreas Gohr    {
17f62ea8a1Sandi        return 'substition';
18f62ea8a1Sandi    }
19f62ea8a1Sandi
20f62ea8a1Sandi    /**
21896a5c22Sandi     * What about paragraphs?
22896a5c22Sandi     */
23957f36a6SAndreas Gohr    public function getPType()
24957f36a6SAndreas Gohr    {
25896a5c22Sandi        return 'block';
26896a5c22Sandi    }
27896a5c22Sandi
28896a5c22Sandi    /**
29f62ea8a1Sandi     * Where to sort in?
30f62ea8a1Sandi     */
31957f36a6SAndreas Gohr    public function getSort()
32957f36a6SAndreas Gohr    {
33f62ea8a1Sandi        return 155;
34f62ea8a1Sandi    }
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;
104*7210c855SAndreas Gohr                case 'datetime':
105*7210c855SAndreas Gohr                    $renderer->doc .= date('r');
106*7210c855SAndreas Gohr                    break;
107f62ea8a1Sandi                default:
108f62ea8a1Sandi                    $renderer->doc .= "no info about ".htmlspecialchars($data[0]);
109f62ea8a1Sandi            }
110f62ea8a1Sandi            return true;
111f62ea8a1Sandi        }
112f62ea8a1Sandi        return false;
113f62ea8a1Sandi    }
114f62ea8a1Sandi
115f62ea8a1Sandi    /**
116c06c1c7aSEsther Brunner     * list all installed plugins
117896a5c22Sandi     *
118896a5c22Sandi     * uses some of the original renderer methods
119253d4b48SGerrit Uitslag     *
120253d4b48SGerrit Uitslag     * @param string $type
121253d4b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
122896a5c22Sandi     */
123957f36a6SAndreas Gohr    protected function renderPlugins($type, Doku_Renderer_xhtml $renderer)
124957f36a6SAndreas Gohr    {
125896a5c22Sandi        global $lang;
126896a5c22Sandi        $renderer->doc .= '<ul>';
127896a5c22Sandi
128c06c1c7aSEsther Brunner        $plugins = plugin_list($type);
1295f5f3ddcSAndreas Gohr        $plginfo = array();
1305f5f3ddcSAndreas Gohr
1315f5f3ddcSAndreas Gohr        // remove subparts
132896a5c22Sandi        foreach ($plugins as $p) {
1339b3b9e8eSGerrit Uitslag            if (!$po = plugin_load($type, $p)) continue;
134253d4b48SGerrit Uitslag            list($name,/* $part */) = explode('_', $p, 2);
1355f5f3ddcSAndreas Gohr            $plginfo[$name] = $po->getInfo();
1365f5f3ddcSAndreas Gohr        }
137896a5c22Sandi
1385f5f3ddcSAndreas Gohr        // list them
1395f5f3ddcSAndreas Gohr        foreach ($plginfo as $info) {
1400c6b58a8SAndreas Gohr            $renderer->doc .= '<li><div class="li">';
141896a5c22Sandi            $renderer->externallink($info['url'], $info['name']);
142896a5c22Sandi            $renderer->doc .= ' ';
14396331712SAnika Henke            $renderer->doc .= '<em>'.$info['date'].'</em>';
144896a5c22Sandi            $renderer->doc .= ' ';
145896a5c22Sandi            $renderer->doc .= $lang['by'];
146896a5c22Sandi            $renderer->doc .= ' ';
147896a5c22Sandi            $renderer->emaillink($info['email'], $info['author']);
148896a5c22Sandi            $renderer->doc .= '<br />';
149c06c1c7aSEsther Brunner            $renderer->doc .= strtr(hsc($info['desc']), array("\n"=>"<br />"));
1500c6b58a8SAndreas Gohr            $renderer->doc .= '</div></li>';
1514f32716eSAndreas Gohr            unset($po);
152896a5c22Sandi        }
153896a5c22Sandi
154896a5c22Sandi        $renderer->doc .= '</ul>';
155896a5c22Sandi    }
156896a5c22Sandi
157896a5c22Sandi    /**
158c06c1c7aSEsther Brunner     * list all installed plugins
159c06c1c7aSEsther Brunner     *
160c06c1c7aSEsther Brunner     * uses some of the original renderer methods
161253d4b48SGerrit Uitslag     *
162253d4b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
163c06c1c7aSEsther Brunner     */
164957f36a6SAndreas Gohr    protected function renderHelperMethods(Doku_Renderer_xhtml $renderer)
165957f36a6SAndreas Gohr    {
166c06c1c7aSEsther Brunner        $plugins = plugin_list('helper');
167c06c1c7aSEsther Brunner        foreach ($plugins as $p) {
1689b3b9e8eSGerrit Uitslag            if (!$po = plugin_load('helper', $p)) continue;
169c06c1c7aSEsther Brunner
170c06c1c7aSEsther Brunner            if (!method_exists($po, 'getMethods')) continue;
171c06c1c7aSEsther Brunner            $methods = $po->getMethods();
172c06c1c7aSEsther Brunner            $info = $po->getInfo();
173c06c1c7aSEsther Brunner
174957f36a6SAndreas Gohr            $hid = $this->addToToc($info['name'], 2, $renderer);
175c06c1c7aSEsther Brunner            $doc = '<h2><a name="'.$hid.'" id="'.$hid.'">'.hsc($info['name']).'</a></h2>';
176c06c1c7aSEsther Brunner            $doc .= '<div class="level2">';
177c06c1c7aSEsther Brunner            $doc .= '<p>'.strtr(hsc($info['desc']), array("\n"=>"<br />")).'</p>';
1789b3b9e8eSGerrit Uitslag            $doc .= '<pre class="code">$'.$p." = plugin_load('helper', '".$p."');</pre>";
179c06c1c7aSEsther Brunner            $doc .= '</div>';
180c06c1c7aSEsther Brunner            foreach ($methods as $method) {
181c06c1c7aSEsther Brunner                $title = '$'.$p.'->'.$method['name'].'()';
182957f36a6SAndreas Gohr                $hid = $this->addToToc($title, 3, $renderer);
183c06c1c7aSEsther Brunner                $doc .= '<h3><a name="'.$hid.'" id="'.$hid.'">'.hsc($title).'</a></h3>';
184c06c1c7aSEsther Brunner                $doc .= '<div class="level3">';
185c7b28ffdSAnika Henke                $doc .= '<div class="table"><table class="inline"><tbody>';
186c06c1c7aSEsther Brunner                $doc .= '<tr><th>Description</th><td colspan="2">'.$method['desc'].
187c06c1c7aSEsther Brunner                    '</td></tr>';
188c06c1c7aSEsther Brunner                if ($method['params']) {
189c06c1c7aSEsther Brunner                    $c = count($method['params']);
190c06c1c7aSEsther Brunner                    $doc .= '<tr><th rowspan="'.$c.'">Parameters</th><td>';
191c06c1c7aSEsther Brunner                    $params = array();
192c06c1c7aSEsther Brunner                    foreach ($method['params'] as $desc => $type) {
193c06c1c7aSEsther Brunner                        $params[] = hsc($desc).'</td><td>'.hsc($type);
194c06c1c7aSEsther Brunner                    }
1955312cb0bSSyntaxseed                    $doc .= join('</td></tr><tr><td>', $params).'</td></tr>';
196c06c1c7aSEsther Brunner                }
197c06c1c7aSEsther Brunner                if ($method['return']) {
198c06c1c7aSEsther Brunner                    $doc .= '<tr><th>Return value</th><td>'.hsc(key($method['return'])).
199c06c1c7aSEsther Brunner                        '</td><td>'.hsc(current($method['return'])).'</td></tr>';
200c06c1c7aSEsther Brunner                }
201c7b28ffdSAnika Henke                $doc .= '</tbody></table></div>';
202c06c1c7aSEsther Brunner                $doc .= '</div>';
203c06c1c7aSEsther Brunner            }
204c06c1c7aSEsther Brunner            unset($po);
205c06c1c7aSEsther Brunner
206c06c1c7aSEsther Brunner            $renderer->doc .= $doc;
207c06c1c7aSEsther Brunner        }
208c06c1c7aSEsther Brunner    }
209c06c1c7aSEsther Brunner
210c06c1c7aSEsther Brunner    /**
211f62ea8a1Sandi     * lists all known syntax types and their registered modes
212253d4b48SGerrit Uitslag     *
213253d4b48SGerrit Uitslag     * @return string
214f62ea8a1Sandi     */
215957f36a6SAndreas Gohr    protected function renderSyntaxTypes()
216957f36a6SAndreas Gohr    {
217f62ea8a1Sandi        global $PARSER_MODES;
218f62ea8a1Sandi        $doc  = '';
219f62ea8a1Sandi
220c7b28ffdSAnika Henke        $doc .= '<div class="table"><table class="inline"><tbody>';
221f62ea8a1Sandi        foreach ($PARSER_MODES as $mode => $modes) {
222f62ea8a1Sandi            $doc .= '<tr>';
223f62ea8a1Sandi            $doc .= '<td class="leftalign">';
224f62ea8a1Sandi            $doc .= $mode;
225f62ea8a1Sandi            $doc .= '</td>';
226f62ea8a1Sandi            $doc .= '<td class="leftalign">';
227f62ea8a1Sandi            $doc .= join(', ', $modes);
228f62ea8a1Sandi            $doc .= '</td>';
229f62ea8a1Sandi            $doc .= '</tr>';
230f62ea8a1Sandi        }
231c7b28ffdSAnika Henke        $doc .= '</tbody></table></div>';
232f62ea8a1Sandi        return $doc;
233f62ea8a1Sandi    }
234f62ea8a1Sandi
235f62ea8a1Sandi    /**
236f62ea8a1Sandi     * lists all known syntax modes and their sorting value
237253d4b48SGerrit Uitslag     *
238253d4b48SGerrit Uitslag     * @return string
239f62ea8a1Sandi     */
240957f36a6SAndreas Gohr    protected function renderSyntaxModes()
241957f36a6SAndreas Gohr    {
242f62ea8a1Sandi        $modes = p_get_parsermodes();
243f62ea8a1Sandi
244a27c9d6fSGerrit Uitslag        $compactmodes = array();
245f62ea8a1Sandi        foreach ($modes as $mode) {
246a27c9d6fSGerrit Uitslag            $compactmodes[$mode['sort']][] = $mode['mode'];
247f62ea8a1Sandi        }
248a27c9d6fSGerrit Uitslag        $doc  = '';
249a27c9d6fSGerrit Uitslag        $doc .= '<div class="table"><table class="inline"><tbody>';
250a27c9d6fSGerrit Uitslag
251a27c9d6fSGerrit Uitslag        foreach ($compactmodes as $sort => $modes) {
252a27c9d6fSGerrit Uitslag            $rowspan = '';
253a27c9d6fSGerrit Uitslag            if (count($modes) > 1) {
254a27c9d6fSGerrit Uitslag                $rowspan = ' rowspan="'.count($modes).'"';
255a27c9d6fSGerrit Uitslag            }
256a27c9d6fSGerrit Uitslag
257a27c9d6fSGerrit Uitslag            foreach ($modes as $index => $mode) {
258a27c9d6fSGerrit Uitslag                $doc .= '<tr>';
259a27c9d6fSGerrit Uitslag                $doc .= '<td class="leftalign">';
260a27c9d6fSGerrit Uitslag                $doc .= $mode;
261a27c9d6fSGerrit Uitslag                $doc .= '</td>';
262a27c9d6fSGerrit Uitslag
263a27c9d6fSGerrit Uitslag                if ($index === 0) {
264a27c9d6fSGerrit Uitslag                    $doc .= '<td class="rightalign" '.$rowspan.'>';
265a27c9d6fSGerrit Uitslag                    $doc .= $sort;
266a27c9d6fSGerrit Uitslag                    $doc .= '</td>';
267a27c9d6fSGerrit Uitslag                }
268a27c9d6fSGerrit Uitslag                $doc .= '</tr>';
269a27c9d6fSGerrit Uitslag            }
270a27c9d6fSGerrit Uitslag        }
271a27c9d6fSGerrit Uitslag
272a27c9d6fSGerrit Uitslag        $doc .= '</tbody></table></div>';
273f62ea8a1Sandi        return $doc;
274f62ea8a1Sandi    }
275c06c1c7aSEsther Brunner
276c06c1c7aSEsther Brunner    /**
277c06c1c7aSEsther Brunner     * Adds a TOC item
27859bc3b48SGerrit Uitslag     *
27959bc3b48SGerrit Uitslag     * @param string $text
28059bc3b48SGerrit Uitslag     * @param int $level
28159bc3b48SGerrit Uitslag     * @param Doku_Renderer_xhtml $renderer
28259bc3b48SGerrit Uitslag     * @return string
283c06c1c7aSEsther Brunner     */
284957f36a6SAndreas Gohr    protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer)
285957f36a6SAndreas Gohr    {
286c06c1c7aSEsther Brunner        global $conf;
287c06c1c7aSEsther Brunner
28859bc3b48SGerrit Uitslag        $hid = '';
289c06c1c7aSEsther Brunner        if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) {
290e0c26282SGerrit Uitslag            $hid  = $renderer->_headerToLink($text, true);
291c06c1c7aSEsther Brunner            $renderer->toc[] = array(
292c06c1c7aSEsther Brunner                'hid'   => $hid,
293c06c1c7aSEsther Brunner                'title' => $text,
294c06c1c7aSEsther Brunner                'type'  => 'ul',
295c06c1c7aSEsther Brunner                'level' => $level - $conf['toptoclevel'] + 1
296c06c1c7aSEsther Brunner            );
297c06c1c7aSEsther Brunner        }
298c06c1c7aSEsther Brunner        return $hid;
299c06c1c7aSEsther Brunner    }
300f62ea8a1Sandi}
301f62ea8a1Sandi
302e3776c06SMichael Hamann//Setup VIM: ex: et ts=4 :
303