]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/PluginManager.php
only WikiDB method missing
[SourceForge/phpwiki.git] / lib / plugin / PluginManager.php
1 <?php // -*-php-*-
2 rcs_id('$Id: PluginManager.php,v 1.13 2004-01-25 03:58:44 rurban Exp $');
3 /**
4  Copyright 1999, 2000, 2001, 2002 $ThePhpWikiProgrammingTeam
5
6  This file is part of PhpWiki.
7
8  PhpWiki is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12
13  PhpWiki is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with PhpWiki; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22
23 // Set this to true if you don't want regular users to view this page.
24 // So far there are no known security issues.
25 define('REQUIRE_ADMIN', false);
26
27 class WikiPlugin_PluginManager
28 extends WikiPlugin
29 {
30     function getName () {
31         return _("PluginManager");
32     }
33
34     function getDescription () {
35         return _("Description: Provides a list of plugins on this wiki.");
36     }
37
38     function getVersion() {
39         return preg_replace("/[Revision: $]/", '',
40                             "\$Revision: 1.13 $");
41     }
42
43     function getDefaultArguments() {
44         return array('info' => 'args');
45     }
46
47     function run($dbi, $argstr, $request) {
48         extract($this->getArgs($argstr, $request));
49
50         $h = HTML();
51         $this->_generatePageheader($info, $h);
52
53         if (! REQUIRE_ADMIN || $request->_user->isadmin()) {
54             $h->pushContent(HTML::h2(_("Plugins")));
55
56             $table = HTML::table(array('class' => "pagelist"));
57             $this->_generateColgroups($info, $table);
58             $this->_generateColheadings($info, $table);
59             $this->_generateTableBody($info, $dbi, $request, $table);
60             $h->pushContent($table);
61
62             //$h->pushContent(HTML::h2(_("Disabled Plugins")));
63         }
64         else {
65             $h->pushContent(fmt("You must be an administrator to %s.",
66                                 _("use this plugin")));
67         }
68         return $h;
69     }
70
71     function _generatePageheader(&$info, &$html) {
72         $html->pushContent(HTML::p($this->getDescription()));
73     }
74
75     function _generateColgroups(&$info, &$table) {
76         // specify last two column widths
77         $colgroup = HTML::colgroup();
78         $colgroup->pushContent(HTML::col(array('width' => '0*')));
79         $colgroup->pushContent(HTML::col(array('width' => '0*',
80                                                'align' => 'right')));
81         $colgroup->pushContent(HTML::col(array('width' => '9*')));
82         if ($info == 'args')
83             $colgroup->pushContent(HTML::col(array('width' => '2*')));
84         $table->pushcontent($colgroup);
85     }
86
87     function _generateColheadings(&$info, &$table) {
88         // table headings
89         $tr = HTML::tr();
90         $headings = array(_("Plugin"), _("Version"), _("Description"));
91         if ($info == 'args')
92             $headings []= _("Arguments");
93         foreach ($headings as $title) {
94             $tr->pushContent(HTML::td($title));
95         }
96         $table->pushContent(HTML::thead($tr));
97     }
98
99     function _generateTableBody(&$info, &$dbi, &$request, &$table) {
100         $plugin_dir = 'lib/plugin';
101         if (defined('PHPWIKI_DIR'))
102             $plugin_dir = PHPWIKI_DIR . "/$plugin_dir";
103         $pd = new fileSet($plugin_dir, '*.php');
104         $plugins = $pd->getFiles();
105         unset($pd);
106         sort($plugins);
107
108         // table body
109         $tbody = HTML::tbody();
110         $row_no = 0;
111
112         $w = new WikiPluginLoader;
113         foreach($plugins as $pluginName) {
114             // instantiate a plugin
115             $pluginName = str_replace(".php", "", $pluginName);
116             $temppluginclass = "<? plugin $pluginName ?>"; // hackish
117             $p = $w->getPlugin($pluginName, false); // second arg?
118             // trap php files which aren't WikiPlugin~s
119             if (!substr(get_parent_class($p), 0, 10) == 'wikiplugin') {
120                 // Security: Hide names of extraneous files within
121                 // plugin dir from non-admins.
122                 if ($request->_user->isadmin())
123                     trigger_error(sprintf(_("%s does not appear to be a WikiPlugin."),
124                                           $pluginName . ".php"));
125                 continue; // skip this non WikiPlugin file
126             }
127             $desc = $p->getDescription();
128             $ver = $p->getVersion();
129             $args = $p->getDefaultArguments();
130             unset($p); //done querying plugin object, release from memory
131
132             $arguments = HTML();
133             foreach ($args as $arg => $default) {
134                 // Word around UserPreferences plugin to avoid error
135                 if ((is_array($default))) {
136                     $default = '(array)';
137                     // This is a bit flawed with UserPreferences object
138                     //$default = sprintf("array('%s')",
139                     //                   implode("', '", array_keys($default)));
140                 }
141                 else
142                     if (stristr($default, ' '))
143                         $default = "'$default'";
144                 $arguments->pushcontent("$arg=$default", HTML::br());
145             }
146             // make a link if an actionpage exists
147             $pluginNamelink = $pluginName;
148             $pluginDocPageNamelink = false;
149             // Also look for pages in the current locale
150             // Maybe FIXME? warn about case language != en and _(p) == "p"?
151             if (_($pluginName) != $pluginName) {
152                 $localizedPluginName = _($pluginName);
153             }
154             else
155                 $localizedPluginName = '';
156             $pluginNamelink = WikiLink($pluginName, 'if_known');
157             // make another link for the localized plugin description
158             // page if it exists
159             $pluginDocPageName = $pluginName . "Plugin";
160             // Also look for pages in the current locale
161             if (_($pluginDocPageName) != $pluginDocPageName) {
162                 $localizedPluginDocPageName = _($pluginDocPageName);
163             }
164             else
165                 $localizedPluginDocPageName = '';
166
167             if (isWikiWord($pluginDocPageName) && $dbi->isWikiPage($pluginDocPageName))
168                 {
169                 $pluginDocPageNamelink = HTML(WikiLink($pluginDocPageName));
170             }
171             else {
172                 // don't link to actionpages and plugins starting with
173                 // an _ from page list
174                 if (!preg_match("/^_/", $pluginName)
175                     //&& !(@$request->isActionPage($pluginName)) //FIXME?
176                     ) {
177                     $pluginDocPageNamelink = WikiLink($pluginDocPageName,
178                                                       'unknown');
179                 }
180                 else
181                     $pluginDocPageNamelink = false;
182             }
183             // insert any found locale-specific pages at the bottom of
184             // the td
185             if ($localizedPluginName || $localizedPluginDocPageName) {
186                 $par = HTML::p();
187                 if ($localizedPluginName) {
188                     // Don't offer to create a link to a non-wikiword
189                     // localized plugin page but show those that
190                     // already exist (Calendar, Comment, etc.)  (Non
191                     // non-wikiword plugins are okay, they just can't
192                     // become actionPages.)
193                     if (isWikiWord($localizedPluginName)
194                         || $dbi->isWikiPage($localizedPluginName))
195                         {
196                         $par->pushContent(WikiLink($localizedPluginName,
197                                                    'auto'));
198                     }
199                     else {
200                         // probably incorrectly translated, so no page
201                         // link
202                         $par->pushContent($localizedPluginName, ' '
203                                           . _("(Not a WikiWord)"));
204                     }
205                 }
206                 if ($localizedPluginName && $localizedPluginDocPageName)
207                     $par->pushContent(HTML::br());
208                 if ($localizedPluginDocPageName) {
209                     if (isWikiWord($localizedPluginDocPageName)
210                         || $dbi->isWikiPage($localizedPluginDocPageName))
211                         {
212                         $par->pushContent(WikiLink($localizedPluginDocPageName,
213                                                    'auto'));
214                     }
215                     else {
216                         // probably incorrectly translated, so no page
217                         // link
218                         $par->pushContent($localizedPluginDocPageName, ' '
219                                           . _("(Not a WikiWord)"));
220                     }
221                 }
222                 $pluginDocPageNamelink->pushContent($par);
223             }
224
225             // highlight alternate rows
226             $row_no++;
227             $group = (int)($row_no / 1); //_group_rows
228             $class = ($group % 2) ? 'evenrow' : 'oddrow';
229             // generate table row
230             $tr = HTML::tr(array('class' => $class));
231             if ($pluginDocPageNamelink) {
232                 // plugin has a description page 'PluginName' . 'Plugin'
233                 $tr->pushContent(HTML::td($pluginNamelink, HTML::br(),
234                                           $pluginDocPageNamelink));
235                 $pluginDocPageNamelink = false;
236                 //$row_no++;
237             }
238             else {
239                 // plugin just has an actionpage
240                 $tr->pushContent(HTML::td($pluginNamelink));
241             }
242             $tr->pushContent(HTML::td($ver), HTML::td($desc));
243             if ($info == 'args') {
244                 // add Arguments column
245                 $style = array('style'
246                                => 'font-family:monospace;font-size:smaller');
247                 $tr->pushContent(HTML::td($style, $arguments));
248             }
249             $tbody->pushContent($tr);
250         }
251         $table->pushContent($tbody);
252     }
253 };
254
255 // $Log: not supported by cvs2svn $
256 // Revision 1.12  2004/01/04 18:14:49  wainstead
257 // Added "Description:" to the beginning of the description string, so
258 // the plugin plays nice with surrounding text.
259 //
260 // Revision 1.11  2003/12/10 01:01:24  carstenklapp
261 // New features: Also show plugin pages for localized variants.
262 // Gracefully handle broken plugins in the plugins folder (such as other
263 // lingering php files).
264 //
265 // Bugfix: Cleaned up Php warnings related to oddities of UserPreference
266 // plugin (whose default value contains an array).
267 //
268 // Internal changes: Gave GoodVariableNames to the nightmarish
269 // ones. Simplified some code with WikiLink 'if_known'.
270 //
271 // Revision 1.10  2003/11/30 18:23:48  carstenklapp
272 // Code housekeeping: PEAR coding standards reformatting only.
273 //
274 // Revision 1.9  2003/11/19 00:02:42  carstenklapp
275 // Include found locale-specific pages for the current (non-English)
276 // locale.
277 //
278 // Revision 1.8  2003/11/15 21:53:53  wainstead
279 // Minor change: list plugins in asciibetical order. It'd be better if
280 // they were alphabetical.
281 //
282 // Revision 1.7  2003/02/24 01:36:25  dairiki
283 // Don't use PHPWIKI_DIR unless it's defined.
284 // (Also typo/bugfix in SystemInfo plugin.)
285 //
286 // Revision 1.6  2003/02/24 00:56:53  carstenklapp
287 // Updated to work with recent changes to WikiLink function (fix
288 // "==Object(wikipagename)==" for unknown wiki links).
289 //
290 // Revision 1.5  2003/02/22 20:49:56  dairiki
291 // Fixes for "Call-time pass by reference has been deprecated" errors.
292 //
293 // Revision 1.4  2003/02/20 18:13:38  carstenklapp
294 // Workaround for recent changes to WikiPlugin->getPlugin.
295 // Made admin restriction for viewing this page optional.
296 // Now defaults to any user may view this page (mainly for PhpWiki Demo site).
297 // Minor code changes & reformatting.
298 //
299 // Revision 1.3  2003/01/04 02:30:12  carstenklapp
300 // Added 'info' argument to show / hide plugin "Arguments"
301 // column. Improved row highlighting and error message when viewed by
302 // non-admin user. Code refactored. Added copyleft.
303
304 // Local Variables:
305 // mode: php
306 // tab-width: 8
307 // c-basic-offset: 4
308 // c-hanging-comment-ender-p: nil
309 // indent-tabs-mode: nil
310 // End:
311 ?>