xref: /dokuwiki/lib/plugins/info/syntax.php (revision 9b3b9e8e02000edb4c6359d9ad50fbeeab0a4612)
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 */
9e04f1f16Schris// must be run within Dokuwiki
10e04f1f16Schrisif(!defined('DOKU_INC')) die();
11f62ea8a1Sandi
12f62ea8a1Sandi/**
13f62ea8a1Sandi * All DokuWiki plugins to extend the parser/rendering mechanism
14f62ea8a1Sandi * need to inherit from this class
15f62ea8a1Sandi */
16f62ea8a1Sandiclass syntax_plugin_info extends DokuWiki_Syntax_Plugin {
17f62ea8a1Sandi
18f62ea8a1Sandi    /**
19f62ea8a1Sandi     * What kind of syntax are we?
20f62ea8a1Sandi     */
21f62ea8a1Sandi    function getType(){
22f62ea8a1Sandi        return 'substition';
23f62ea8a1Sandi    }
24f62ea8a1Sandi
25f62ea8a1Sandi    /**
26896a5c22Sandi     * What about paragraphs?
27896a5c22Sandi     */
28896a5c22Sandi    function getPType(){
29896a5c22Sandi        return 'block';
30896a5c22Sandi    }
31896a5c22Sandi
32896a5c22Sandi    /**
33f62ea8a1Sandi     * Where to sort in?
34f62ea8a1Sandi     */
35f62ea8a1Sandi    function getSort(){
36f62ea8a1Sandi        return 155;
37f62ea8a1Sandi    }
38f62ea8a1Sandi
39f62ea8a1Sandi
40f62ea8a1Sandi    /**
41f62ea8a1Sandi     * Connect pattern to lexer
42f62ea8a1Sandi     */
43f62ea8a1Sandi    function connectTo($mode) {
44f62ea8a1Sandi        $this->Lexer->addSpecialPattern('~~INFO:\w+~~',$mode,'plugin_info');
45f62ea8a1Sandi    }
46f62ea8a1Sandi
47f62ea8a1Sandi
48f62ea8a1Sandi    /**
49f62ea8a1Sandi     * Handle the match
50f62ea8a1Sandi     */
51*9b3b9e8eSGerrit Uitslag    function handle($match, $state, $pos, Doku_Handler &$handler){
52f62ea8a1Sandi        $match = substr($match,7,-2); //strip ~~INFO: from start and ~~ from end
53f62ea8a1Sandi        return array(strtolower($match));
54f62ea8a1Sandi    }
55f62ea8a1Sandi
56f62ea8a1Sandi    /**
57f62ea8a1Sandi     * Create output
58f62ea8a1Sandi     */
59*9b3b9e8eSGerrit Uitslag    function render($format, Doku_Renderer &$renderer, $data) {
60f4e5a570Schris        if($format == 'xhtml'){
61f62ea8a1Sandi            //handle various info stuff
62f62ea8a1Sandi            switch ($data[0]){
63896a5c22Sandi                case 'syntaxmodes':
64f62ea8a1Sandi                    $renderer->doc .= $this->_syntaxmodes_xhtml();
65f62ea8a1Sandi                    break;
66896a5c22Sandi                case 'syntaxtypes':
67f62ea8a1Sandi                    $renderer->doc .= $this->_syntaxtypes_xhtml();
68f62ea8a1Sandi                    break;
69896a5c22Sandi                case 'syntaxplugins':
70c06c1c7aSEsther Brunner                    $this->_plugins_xhtml('syntax', $renderer);
71c06c1c7aSEsther Brunner                    break;
72c06c1c7aSEsther Brunner                case 'adminplugins':
73c06c1c7aSEsther Brunner                    $this->_plugins_xhtml('admin', $renderer);
74c06c1c7aSEsther Brunner                    break;
75c06c1c7aSEsther Brunner                case 'actionplugins':
76c06c1c7aSEsther Brunner                    $this->_plugins_xhtml('action', $renderer);
77c06c1c7aSEsther Brunner                    break;
78c06c1c7aSEsther Brunner                case 'rendererplugins':
79c06c1c7aSEsther Brunner                    $this->_plugins_xhtml('renderer', $renderer);
80c06c1c7aSEsther Brunner                    break;
81c06c1c7aSEsther Brunner                case 'helperplugins':
82c06c1c7aSEsther Brunner                    $this->_plugins_xhtml('helper', $renderer);
83c06c1c7aSEsther Brunner                    break;
84603a6381SKlap-in                case 'authplugins':
85603a6381SKlap-in                    $this->_plugins_xhtml('auth', $renderer);
86603a6381SKlap-in                    break;
87603a6381SKlap-in                case 'remoteplugins':
88603a6381SKlap-in                    $this->_plugins_xhtml('remote', $renderer);
89603a6381SKlap-in                    break;
90c06c1c7aSEsther Brunner                case 'helpermethods':
91c06c1c7aSEsther Brunner                    $this->_helpermethods_xhtml($renderer);
92896a5c22Sandi                    break;
93f62ea8a1Sandi                default:
94f62ea8a1Sandi                    $renderer->doc .= "no info about ".htmlspecialchars($data[0]);
95f62ea8a1Sandi            }
96f62ea8a1Sandi            return true;
97f62ea8a1Sandi        }
98f62ea8a1Sandi        return false;
99f62ea8a1Sandi    }
100f62ea8a1Sandi
101f62ea8a1Sandi    /**
102c06c1c7aSEsther Brunner     * list all installed plugins
103896a5c22Sandi     *
104896a5c22Sandi     * uses some of the original renderer methods
105896a5c22Sandi     */
10638479cbbSDominik Eckelmann    function _plugins_xhtml($type, Doku_Renderer &$renderer){
107896a5c22Sandi        global $lang;
108896a5c22Sandi        $renderer->doc .= '<ul>';
109896a5c22Sandi
110c06c1c7aSEsther Brunner        $plugins = plugin_list($type);
1115f5f3ddcSAndreas Gohr        $plginfo = array();
1125f5f3ddcSAndreas Gohr
1135f5f3ddcSAndreas Gohr        // remove subparts
114896a5c22Sandi        foreach($plugins as $p){
115*9b3b9e8eSGerrit Uitslag            if (!$po = plugin_load($type,$p)) continue;
1165f5f3ddcSAndreas Gohr            list($name,$part) = explode('_',$p,2);
1175f5f3ddcSAndreas Gohr            $plginfo[$name] = $po->getInfo();
1185f5f3ddcSAndreas Gohr        }
119896a5c22Sandi
1205f5f3ddcSAndreas Gohr        // list them
1215f5f3ddcSAndreas Gohr        foreach($plginfo as $info){
1220c6b58a8SAndreas Gohr            $renderer->doc .= '<li><div class="li">';
123896a5c22Sandi            $renderer->externallink($info['url'],$info['name']);
124896a5c22Sandi            $renderer->doc .= ' ';
12596331712SAnika Henke            $renderer->doc .= '<em>'.$info['date'].'</em>';
126896a5c22Sandi            $renderer->doc .= ' ';
127896a5c22Sandi            $renderer->doc .= $lang['by'];
128896a5c22Sandi            $renderer->doc .= ' ';
129896a5c22Sandi            $renderer->emaillink($info['email'],$info['author']);
130896a5c22Sandi            $renderer->doc .= '<br />';
131c06c1c7aSEsther Brunner            $renderer->doc .= strtr(hsc($info['desc']),array("\n"=>"<br />"));
1320c6b58a8SAndreas Gohr            $renderer->doc .= '</div></li>';
1334f32716eSAndreas Gohr            unset($po);
134896a5c22Sandi        }
135896a5c22Sandi
136896a5c22Sandi        $renderer->doc .= '</ul>';
137896a5c22Sandi    }
138896a5c22Sandi
139896a5c22Sandi    /**
140c06c1c7aSEsther Brunner     * list all installed plugins
141c06c1c7aSEsther Brunner     *
142c06c1c7aSEsther Brunner     * uses some of the original renderer methods
143c06c1c7aSEsther Brunner     */
14438479cbbSDominik Eckelmann    function _helpermethods_xhtml(Doku_Renderer &$renderer){
145c06c1c7aSEsther Brunner        global $lang;
146c06c1c7aSEsther Brunner
147c06c1c7aSEsther Brunner        $plugins = plugin_list('helper');
148c06c1c7aSEsther Brunner        foreach($plugins as $p){
149*9b3b9e8eSGerrit Uitslag            if (!$po = plugin_load('helper',$p)) continue;
150c06c1c7aSEsther Brunner
151c06c1c7aSEsther Brunner            if (!method_exists($po, 'getMethods')) continue;
152c06c1c7aSEsther Brunner            $methods = $po->getMethods();
153c06c1c7aSEsther Brunner            $info = $po->getInfo();
154c06c1c7aSEsther Brunner
155c06c1c7aSEsther Brunner            $hid = $this->_addToTOC($info['name'], 2, $renderer);
156c06c1c7aSEsther Brunner            $doc = '<h2><a name="'.$hid.'" id="'.$hid.'">'.hsc($info['name']).'</a></h2>';
157c06c1c7aSEsther Brunner            $doc .= '<div class="level2">';
158c06c1c7aSEsther Brunner            $doc .= '<p>'.strtr(hsc($info['desc']), array("\n"=>"<br />")).'</p>';
159*9b3b9e8eSGerrit Uitslag            $doc .= '<pre class="code">$'.$p." = plugin_load('helper', '".$p."');</pre>";
160c06c1c7aSEsther Brunner            $doc .= '</div>';
161c06c1c7aSEsther Brunner            foreach ($methods as $method){
162c06c1c7aSEsther Brunner                $title = '$'.$p.'->'.$method['name'].'()';
163c06c1c7aSEsther Brunner                $hid = $this->_addToTOC($title, 3, $renderer);
164c06c1c7aSEsther Brunner                $doc .= '<h3><a name="'.$hid.'" id="'.$hid.'">'.hsc($title).'</a></h3>';
165c06c1c7aSEsther Brunner                $doc .= '<div class="level3">';
166c7b28ffdSAnika Henke                $doc .= '<div class="table"><table class="inline"><tbody>';
167c06c1c7aSEsther Brunner                $doc .= '<tr><th>Description</th><td colspan="2">'.$method['desc'].
168c06c1c7aSEsther Brunner                    '</td></tr>';
169c06c1c7aSEsther Brunner                if ($method['params']){
170c06c1c7aSEsther Brunner                    $c = count($method['params']);
171c06c1c7aSEsther Brunner                    $doc .= '<tr><th rowspan="'.$c.'">Parameters</th><td>';
172c06c1c7aSEsther Brunner                    $params = array();
173c06c1c7aSEsther Brunner                    foreach ($method['params'] as $desc => $type){
174c06c1c7aSEsther Brunner                        $params[] = hsc($desc).'</td><td>'.hsc($type);
175c06c1c7aSEsther Brunner                    }
176c06c1c7aSEsther Brunner                    $doc .= join($params, '</td></tr><tr><td>').'</td></tr>';
177c06c1c7aSEsther Brunner                }
178c06c1c7aSEsther Brunner                if ($method['return']){
179c06c1c7aSEsther Brunner                    $doc .= '<tr><th>Return value</th><td>'.hsc(key($method['return'])).
180c06c1c7aSEsther Brunner                        '</td><td>'.hsc(current($method['return'])).'</td></tr>';
181c06c1c7aSEsther Brunner                }
182c7b28ffdSAnika Henke                $doc .= '</tbody></table></div>';
183c06c1c7aSEsther Brunner                $doc .= '</div>';
184c06c1c7aSEsther Brunner            }
185c06c1c7aSEsther Brunner            unset($po);
186c06c1c7aSEsther Brunner
187c06c1c7aSEsther Brunner            $renderer->doc .= $doc;
188c06c1c7aSEsther Brunner        }
189c06c1c7aSEsther Brunner    }
190c06c1c7aSEsther Brunner
191c06c1c7aSEsther Brunner    /**
192f62ea8a1Sandi     * lists all known syntax types and their registered modes
193f62ea8a1Sandi     */
194f62ea8a1Sandi    function _syntaxtypes_xhtml(){
195f62ea8a1Sandi        global $PARSER_MODES;
196f62ea8a1Sandi        $doc  = '';
197f62ea8a1Sandi
198c7b28ffdSAnika Henke        $doc .= '<div class="table"><table class="inline"><tbody>';
199f62ea8a1Sandi        foreach($PARSER_MODES as $mode => $modes){
200f62ea8a1Sandi            $doc .= '<tr>';
201f62ea8a1Sandi            $doc .= '<td class="leftalign">';
202f62ea8a1Sandi            $doc .= $mode;
203f62ea8a1Sandi            $doc .= '</td>';
204f62ea8a1Sandi            $doc .= '<td class="leftalign">';
205f62ea8a1Sandi            $doc .= join(', ',$modes);
206f62ea8a1Sandi            $doc .= '</td>';
207f62ea8a1Sandi            $doc .= '</tr>';
208f62ea8a1Sandi        }
209c7b28ffdSAnika Henke        $doc .= '</tbody></table></div>';
210f62ea8a1Sandi        return $doc;
211f62ea8a1Sandi    }
212f62ea8a1Sandi
213f62ea8a1Sandi    /**
214f62ea8a1Sandi     * lists all known syntax modes and their sorting value
215f62ea8a1Sandi     */
216f62ea8a1Sandi    function _syntaxmodes_xhtml(){
217f62ea8a1Sandi        $modes = p_get_parsermodes();
218f62ea8a1Sandi
219a27c9d6fSGerrit Uitslag        $compactmodes = array();
220f62ea8a1Sandi        foreach($modes as $mode){
221a27c9d6fSGerrit Uitslag            $compactmodes[$mode['sort']][] = $mode['mode'];
222f62ea8a1Sandi        }
223a27c9d6fSGerrit Uitslag        $doc  = '';
224a27c9d6fSGerrit Uitslag        $doc .= '<div class="table"><table class="inline"><tbody>';
225a27c9d6fSGerrit Uitslag
226a27c9d6fSGerrit Uitslag        foreach($compactmodes as $sort => $modes){
227a27c9d6fSGerrit Uitslag            $rowspan = '';
228a27c9d6fSGerrit Uitslag            if(count($modes) > 1) {
229a27c9d6fSGerrit Uitslag                $rowspan = ' rowspan="'.count($modes).'"';
230a27c9d6fSGerrit Uitslag            }
231a27c9d6fSGerrit Uitslag
232a27c9d6fSGerrit Uitslag            foreach($modes as $index => $mode) {
233a27c9d6fSGerrit Uitslag                $doc .= '<tr>';
234a27c9d6fSGerrit Uitslag                $doc .= '<td class="leftalign">';
235a27c9d6fSGerrit Uitslag                $doc .= $mode;
236a27c9d6fSGerrit Uitslag                $doc .= '</td>';
237a27c9d6fSGerrit Uitslag
238a27c9d6fSGerrit Uitslag                if($index === 0) {
239a27c9d6fSGerrit Uitslag                    $doc .= '<td class="rightalign" '.$rowspan.'>';
240a27c9d6fSGerrit Uitslag                    $doc .= $sort;
241a27c9d6fSGerrit Uitslag                    $doc .= '</td>';
242a27c9d6fSGerrit Uitslag                }
243a27c9d6fSGerrit Uitslag                $doc .= '</tr>';
244a27c9d6fSGerrit Uitslag            }
245a27c9d6fSGerrit Uitslag        }
246a27c9d6fSGerrit Uitslag
247a27c9d6fSGerrit Uitslag        $doc .= '</tbody></table></div>';
248f62ea8a1Sandi        return $doc;
249f62ea8a1Sandi    }
250c06c1c7aSEsther Brunner
251c06c1c7aSEsther Brunner    /**
252c06c1c7aSEsther Brunner     * Adds a TOC item
253c06c1c7aSEsther Brunner     */
25438479cbbSDominik Eckelmann    function _addToTOC($text, $level, Doku_Renderer_xhtml &$renderer){
255c06c1c7aSEsther Brunner        global $conf;
256c06c1c7aSEsther Brunner
257c06c1c7aSEsther Brunner        if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])){
258c06c1c7aSEsther Brunner            $hid  = $renderer->_headerToLink($text, 'true');
259c06c1c7aSEsther Brunner            $renderer->toc[] = array(
260c06c1c7aSEsther Brunner                'hid'   => $hid,
261c06c1c7aSEsther Brunner                'title' => $text,
262c06c1c7aSEsther Brunner                'type'  => 'ul',
263c06c1c7aSEsther Brunner                'level' => $level - $conf['toptoclevel'] + 1
264c06c1c7aSEsther Brunner            );
265c06c1c7aSEsther Brunner        }
266c06c1c7aSEsther Brunner        return $hid;
267c06c1c7aSEsther Brunner    }
268f62ea8a1Sandi}
269f62ea8a1Sandi
270e3776c06SMichael Hamann//Setup VIM: ex: et ts=4 :
271