xref: /dokuwiki/lib/plugins/info/syntax.php (revision 78f0e83246184ff6cb8679d086b0fa17ab508057)
1<?php
2/**
3 * Info Plugin: Displays information about various DokuWiki internals
4 *
5 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6 * @author     Andreas Gohr <andi@splitbrain.org>
7 * @author     Esther Brunner <wikidesign@gmail.com>
8 */
9// must be run within Dokuwiki
10if(!defined('DOKU_INC')) die();
11
12/**
13 * All DokuWiki plugins to extend the parser/rendering mechanism
14 * need to inherit from this class
15 */
16class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
17
18    /**
19     * return some info
20     */
21    function getInfo(){
22        return array(
23            'author' => 'Andreas Gohr',
24            'email'  => 'andi@splitbrain.org',
25            'date'   => '2008-09-12',
26            'name'   => 'Info Plugin',
27            'desc'   => 'Displays information about various DokuWiki internals',
28            'url'    => 'http://dokuwiki.org/plugin:info',
29        );
30    }
31
32    /**
33     * What kind of syntax are we?
34     */
35    function getType(){
36        return 'substition';
37    }
38
39    /**
40     * What about paragraphs?
41     */
42    function getPType(){
43        return 'block';
44    }
45
46    /**
47     * Where to sort in?
48     */
49    function getSort(){
50        return 155;
51    }
52
53
54    /**
55     * Connect pattern to lexer
56     */
57    function connectTo($mode) {
58        $this->Lexer->addSpecialPattern('~~INFO:\w+~~',$mode,'plugin_info');
59    }
60
61
62    /**
63     * Handle the match
64     */
65    function handle($match, $state, $pos, &$handler){
66        $match = substr($match,7,-2); //strip ~~INFO: from start and ~~ from end
67        return array(strtolower($match));
68    }
69
70    /**
71     * Create output
72     */
73    function render($format, &$renderer, $data) {
74        if($format == 'xhtml'){
75            //handle various info stuff
76            switch ($data[0]){
77                case 'version':
78                    $renderer->doc .= getVersion();
79                    break;
80                case 'syntaxmodes':
81                    $renderer->doc .= $this->_syntaxmodes_xhtml();
82                    break;
83                case 'syntaxtypes':
84                    $renderer->doc .= $this->_syntaxtypes_xhtml();
85                    break;
86                case 'syntaxplugins':
87                    $this->_plugins_xhtml('syntax', $renderer);
88                    break;
89                case 'adminplugins':
90                    $this->_plugins_xhtml('admin', $renderer);
91                    break;
92                case 'actionplugins':
93                    $this->_plugins_xhtml('action', $renderer);
94                    break;
95                case 'rendererplugins':
96                    $this->_plugins_xhtml('renderer', $renderer);
97                    break;
98                case 'helperplugins':
99                    $this->_plugins_xhtml('helper', $renderer);
100                    break;
101                case 'helpermethods':
102                    $this->_helpermethods_xhtml($renderer);
103                    break;
104                default:
105                    $renderer->doc .= "no info about ".htmlspecialchars($data[0]);
106            }
107            return true;
108        }
109        return false;
110    }
111
112    /**
113     * list all installed plugins
114     *
115     * uses some of the original renderer methods
116     */
117    function _plugins_xhtml($type, &$renderer){
118        global $lang;
119        $renderer->doc .= '<ul>';
120
121        $plugins = plugin_list($type);
122        $plginfo = array();
123
124        // remove subparts
125        foreach($plugins as $p){
126            if (!$po =& plugin_load($type,$p)) continue;
127            list($name,$part) = explode('_',$p,2);
128            $plginfo[$name] = $po->getInfo();
129        }
130
131        // list them
132        foreach($plginfo as $info){
133            $renderer->doc .= '<li><div class="li">';
134            $renderer->externallink($info['url'],$info['name']);
135            $renderer->doc .= ' ';
136            $renderer->doc .= '<em>'.$info['date'].'</em>';
137            $renderer->doc .= ' ';
138            $renderer->doc .= $lang['by'];
139            $renderer->doc .= ' ';
140            $renderer->emaillink($info['email'],$info['author']);
141            $renderer->doc .= '<br />';
142            $renderer->doc .= strtr(hsc($info['desc']),array("\n"=>"<br />"));
143            $renderer->doc .= '</div></li>';
144            unset($po);
145        }
146
147        $renderer->doc .= '</ul>';
148    }
149
150    /**
151     * list all installed plugins
152     *
153     * uses some of the original renderer methods
154     */
155    function _helpermethods_xhtml(&$renderer){
156        global $lang;
157
158        $plugins = plugin_list('helper');
159        foreach($plugins as $p){
160            if (!$po =& plugin_load('helper',$p)) continue;
161
162            if (!method_exists($po, 'getMethods')) continue;
163            $methods = $po->getMethods();
164            $info = $po->getInfo();
165
166            $hid = $this->_addToTOC($info['name'], 2, $renderer);
167            $doc = '<h2><a name="'.$hid.'" id="'.$hid.'">'.hsc($info['name']).'</a></h2>';
168            $doc .= '<div class="level2">';
169            $doc .= '<p>'.strtr(hsc($info['desc']), array("\n"=>"<br />")).'</p>';
170            $doc .= '<pre class="code">$'.$p." =& plugin_load('helper', '".$p."');</pre>";
171            $doc .= '</div>';
172            foreach ($methods as $method){
173                $title = '$'.$p.'->'.$method['name'].'()';
174                $hid = $this->_addToTOC($title, 3, $renderer);
175                $doc .= '<h3><a name="'.$hid.'" id="'.$hid.'">'.hsc($title).'</a></h3>';
176                $doc .= '<div class="level3">';
177                $doc .= '<div class="table"><table class="inline"><tbody>';
178                $doc .= '<tr><th>Description</th><td colspan="2">'.$method['desc'].
179                    '</td></tr>';
180                if ($method['params']){
181                    $c = count($method['params']);
182                    $doc .= '<tr><th rowspan="'.$c.'">Parameters</th><td>';
183                    $params = array();
184                    foreach ($method['params'] as $desc => $type){
185                        $params[] = hsc($desc).'</td><td>'.hsc($type);
186                    }
187                    $doc .= join($params, '</td></tr><tr><td>').'</td></tr>';
188                }
189                if ($method['return']){
190                    $doc .= '<tr><th>Return value</th><td>'.hsc(key($method['return'])).
191                        '</td><td>'.hsc(current($method['return'])).'</td></tr>';
192                }
193                $doc .= '</tbody></table></div>';
194                $doc .= '</div>';
195            }
196            unset($po);
197
198            $renderer->doc .= $doc;
199        }
200    }
201
202    /**
203     * lists all known syntax types and their registered modes
204     */
205    function _syntaxtypes_xhtml(){
206        global $PARSER_MODES;
207        $doc  = '';
208
209        $doc .= '<div class="table"><table class="inline"><tbody>';
210        foreach($PARSER_MODES as $mode => $modes){
211            $doc .= '<tr>';
212            $doc .= '<td class="leftalign">';
213            $doc .= $mode;
214            $doc .= '</td>';
215            $doc .= '<td class="leftalign">';
216            $doc .= join(', ',$modes);
217            $doc .= '</td>';
218            $doc .= '</tr>';
219        }
220        $doc .= '</tbody></table></div>';
221        return $doc;
222    }
223
224    /**
225     * lists all known syntax modes and their sorting value
226     */
227    function _syntaxmodes_xhtml(){
228        $modes = p_get_parsermodes();
229        $doc  = '';
230
231        foreach ($modes as $mode){
232            $doc .= $mode['mode'].' ('.$mode['sort'].'), ';
233        }
234        return $doc;
235    }
236
237    /**
238     * Adds a TOC item
239     */
240    function _addToTOC($text, $level, &$renderer){
241        global $conf;
242
243        if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])){
244            $hid  = $renderer->_headerToLink($text, 'true');
245            $renderer->toc[] = array(
246                'hid'   => $hid,
247                'title' => $text,
248                'type'  => 'ul',
249                'level' => $level - $conf['toptoclevel'] + 1
250            );
251        }
252        return $hid;
253    }
254}
255
256//Setup VIM: ex: et ts=4 :
257