diff options
Diffstat (limited to 'lib/plugins/plugin')
-rw-r--r-- | lib/plugins/plugin/admin.php | 318 | ||||
-rw-r--r-- | lib/plugins/plugin/style.css | 72 |
2 files changed, 195 insertions, 195 deletions
diff --git a/lib/plugins/plugin/admin.php b/lib/plugins/plugin/admin.php index 92df52b61..cebd4e786 100644 --- a/lib/plugins/plugin/admin.php +++ b/lib/plugins/plugin/admin.php @@ -5,16 +5,16 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Christopher Smith <chris@jalakai.co.uk> */ - + // todo // - maintain a history of file modified // - allow a plugin to contain extras to be copied to the current template (extra/tpl/) // - to images (lib/images/) [ not needed, should go in lib/plugin/images/ ] - + if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once(DOKU_PLUGIN.'admin.php'); - + //--------------------------[ GLOBALS ]------------------------------------------------ // note: probably should be dokuwiki wide globals, where they can be accessed by pluginutils.php global $common_plugin_types; @@ -30,25 +30,25 @@ class admin_plugin_plugin extends DokuWiki_Admin_Plugin { var $plugin = ''; var $cmd = ''; var $handler = NULL; - + var $functions = array('delete','update',/*'settings',*/'info'); // require a plugin name var $commands = array('manage','download'); // don't require a plugin name var $plugin_list = array(); - + var $msg = ''; var $error = ''; - + function admin_plugin_plugin() { global $conf; $this->disabled = (isset($conf['pluginmanager']) && ($conf['pluginmanager'] == 0)); } - + /** * return some info */ function getInfo(){ $disabled = ($this->disabled) ? '(disabled)' : ''; - + return array( 'author' => 'Christopher Smith', 'email' => 'chris@jalakai.co.uk', @@ -58,41 +58,41 @@ class admin_plugin_plugin extends DokuWiki_Admin_Plugin { 'url' => 'http://wiki.splitbrain.org/plugin:adminplugin', ); } - + /** * return prompt for admin menu */ function getMenuText($language) { - if (!$this->disabled) + if (!$this->disabled) return parent::getMenuText($language); return ''; } - + /** * return sort order for position in admin menu */ function getMenuSort() { return 20; } - + /** * handle user request */ function handle() { - + if ($this->disabled) return; - + // enable direct access to language strings $this->setupLocale(); - + $this->plugin = $_REQUEST['plugin']; $this->cmd = $_REQUEST['fn']; if (is_array($this->cmd)) $this->cmd = key($this->cmd); - + sort($this->plugin_list = plugin_list()); - + // verify $_REQUEST vars if (in_array($this->cmd, $this->commands)) { $this->plugin = ''; @@ -100,63 +100,63 @@ class admin_plugin_plugin extends DokuWiki_Admin_Plugin { $this->cmd = 'manage'; $this->plugin = ''; } - + // create object to handle the command $class = "ap_".$this->cmd; if (!class_exists($class)) $class = 'ap_manage'; - + $this->handler = & new $class($this, $this->plugin); $this->msg = $this->handler->process(); } - + /** * output appropriate html */ function html() { - + if ($this->disabled) return; // enable direct access to language strings $this->setupLocale(); - + if ($this->handler === NULL) $this->handler = & new ap_manage($this, $this->plugin); if (!$this->plugin_list) sort($this->plugin_list = plugin_list()); - - ptln('<div id="plugin_manager">'); - $this->handler->html(); + + ptln('<div id="plugin__manager">'); + $this->handler->html(); ptln('</div><!-- #plugin_manager -->'); } - + } class ap_manage { - + var $manager = NULL; var $lang = array(); var $plugin = ''; var $downloaded = array(); - + function ap_manage(&$manager, $plugin) { $this->manager = & $manager; $this->plugin = $plugin; - $this->lang = & $manager->lang; + $this->lang = & $manager->lang; } function process() { return ''; } - - function html() { + + function html() { print $this->manager->locale_xhtml('admin_plugin'); - $this->html_menu(); + $this->html_menu(); } - + // build our standard menu function html_menu($listPlugins = true) { global $ID; - + ptln('<div class="pm_menu">'); - + ptln('<div class="common">'); ptln(' <form action="'.wl($ID).'" method="post">'); ptln(' <fieldset class="hidden">',4); @@ -167,28 +167,28 @@ class ap_manage { ptln(' <legend>'.$this->lang['download'].'</legend>'); ptln(' <h3 class="legend">'.$this->lang['download'].'</h3>'); ptln(' <input type="submit" class="button" name="fn[download]" value="'.$this->lang['btn_download'].'" />'); - ptln(' <label for="url">'.$this->lang['url'].'<input name="url" id="url" class="field" type="text" maxlength="200" /></label>'); + ptln(' <label for="dw__url">'.$this->lang['url'].'<input name="url" id="dw__url" class="field" type="text" maxlength="200" /></label>'); ptln(' </fieldset>'); ptln(' </form>'); ptln('</div>'); - + if ($listPlugins) { ptln('<h2>'.$this->lang['manage'].'</h2>'); ptln('<div class="plugins">'); $this->html_pluginlist(); ptln('</div>'); } - + ptln('</div>'); } - + function html_pluginlist() { global $ID; foreach ($this->manager->plugin_list as $plugin) { - + $new = (in_array($plugin, $this->downloaded)) ? ' class="new"' : ''; - + ptln(' <form action="'.wl($ID).'" method="post" '.$new.'>'); ptln(' <h3 class="legend">'.$plugin.'</h3>'); ptln(' <fieldset>'); @@ -196,62 +196,62 @@ class ap_manage { ptln(' <input type="hidden" name="do" value="admin" />'); ptln(' <input type="hidden" name="page" value="plugin" />'); ptln(' <input type="hidden" name="plugin" value="'.$plugin.'" />'); - + $this->html_button('info', false, 6); if (in_array('settings', $this->manager->functions)) { $this->html_button('settings', !@file_exists(DOKU_PLUGIN.$plugin.'/settings.php'), 6); } $this->html_button('update', !$this->plugin_readlog($plugin, 'url'), 6); $this->html_button('delete', false, 6); - + ptln(' </fieldset>'); ptln(' </form>'); } } - + function html_button($btn, $disabled=false, $indent=0) { $disabled = ($disabled) ? 'disabled="disabled"' : ''; ptln('<input type="submit" class="button" '.$disabled.' name="fn['.$btn.']" value="'.$this->lang['btn_'.$btn].'" />',$indent); } - + /** * Refresh plugin list */ function refresh() { - + sort($this->manager->plugin_list = plugin_list()); - - // update latest plugin date - FIXME + + // update latest plugin date - FIXME return (!$this->manager->error); } - + function download($url, $overwrite=false) { global $lang; - + // check the url - $matches = array(); + $matches = array(); if (!preg_match("/[^\/]*$/", $url, $matches) || !$matches[0]) { $this->manager->error = $this->lang['error_badurl']."\n"; return false; } - + $file = $matches[0]; $folder = "p".md5($file.date('r')); // tmp folder name - will be empty (should really make sure it doesn't already exist) $tmp = DOKU_PLUGIN."tmp/$folder"; - + if (!ap_mkdir($tmp)) { $this->manager->error = $this->lang['error_dir_create']."\n"; return false; } - + if (!$file = io_download($url, "$tmp/", true, $file)) { $this->manager->error = sprintf($this->lang['error_download'],$url)."\n"; } - + if (!$this->manager->error && !ap_decompress("$tmp/$file", $tmp)) { $this->manager->error = sprintf($this->lang['error_decompress'],$file)."\n"; } - + // search tmp/$folder for the folder(s) that has been created // move that folder(s) to lib/plugins/ if (!$this->manager->error) { @@ -259,31 +259,31 @@ class ap_manage { while (false !== ($f = readdir($dh))) { if ($f == '.' || $f == '..' || $f == 'tmp') continue; if (!is_dir("$tmp/$f")) continue; - + // check to make sure we aren't overwriting anything if (!$overwrite && @file_exists(DOKU_PLUGIN."/$f")) { // remember our settings, ask the user to confirm overwrite, FIXME continue; } - + $instruction = @file_exists(DOKU_PLUGIN."/$f") ? 'update' : 'install'; - + if (ap_copy("$tmp/$f", DOKU_PLUGIN.$f)) { $this->downloaded[] = $f; $this->plugin_writelog($f, $instruction, array($url)); } else { $this->manager->error .= sprintf($lang['error_copy']."\n", $f); } - } + } closedir($dh); } else { $this->manager->error = $this->lang['error']."\n"; } } - + // cleanup if ($folder && is_dir(DOKU_PLUGIN."tmp/$folder")) ap_delete(DOKU_PLUGIN."tmp/$folder"); - + if (!$this->manager->error) { $this->refresh(); return true; @@ -291,12 +291,12 @@ class ap_manage { return false; } - - // log + + // log function plugin_writelog($plugin, $cmd, $data) { - + $file = DOKU_PLUGIN.$plugin.'/manager.dat'; - + switch ($cmd) { case 'install' : $url = $data[0]; @@ -305,7 +305,7 @@ class ap_manage { fwrite($fp, "installed=$date\nurl=$url\n"); fclose($fp); break; - + case 'update' : $date = date('r'); if (!$fp = @fopen($file, 'a')) return; @@ -314,47 +314,47 @@ class ap_manage { break; } } - + function plugin_readlog($plugin, $field) { static $log = array(); $file = DOKU_PLUGIN.$plugin.'/manager.dat'; - + if (!isset($log[$plugin])) { $tmp = @file_get_contents($file); if (!$tmp) return ''; $log[$plugin] = & $tmp; } - + if ($field == 'ALL') { return $log[$plugin]; } - - $match = array(); + + $match = array(); if (preg_match_all('/'.$field.'=(.*)$/m',$log[$plugin], $match)) return implode("\n", $match[1]); - + return ''; } } - + class ap_download extends ap_manage { - + var $overwrite = false; - + function process() { global $lang; - + $plugin_url = $_REQUEST['url']; $this->download($plugin_url, $this->overwrite); return ''; } - + function html() { parent::html(); - + ptln('<div class="pm_info">'); ptln('<h2>'.$this->lang['downloading'].'</h2>'); - + if ($this->manager->error) { ptln('<div class="error">'.str_replace("\n","<br />",$this->manager->error).'</div>'); } else if (count($this->downloaded) == 1) { @@ -371,26 +371,26 @@ class ap_manage { } ptln('</div>'); } - + } - + class ap_delete extends ap_manage { - - function process() { - + + function process() { + if (!ap_delete(DOKU_PLUGIN.$this->manager->plugin)) { $this->manager->error = sprintf($this->lang['error_delete'],$this->manager->plugin); } else { $this->refresh(); } } - + function html() { parent::html(); - + ptln('<div class="pm_info">'); ptln('<h2>'.$this->lang['deleting'].'</h2>'); - + if ($this->manager->error) { ptln('<div class="error">'.str_replace("\n","<br />",$this->manager->error).'</div>'); } else { @@ -399,63 +399,63 @@ class ap_manage { ptln('</div>'); } } - + class ap_info extends ap_manage { - + var $plugin_info = array(); // the plugin itself var $details = array(); // any component plugins - function process() { - + function process() { + // sanity check if (!$this->manager->plugin) { return; } - + $component_list = ap_plugin_components($this->manager->plugin); usort($component_list, ap_component_sort); - + foreach ($component_list as $component) { if ($obj = & plugin_load($component['type'],$component['name']) === NULL) continue; - + $this->details[] = array_merge($obj->getInfo(), array('type' => $component['type'])); unset($obj); } - + // review details to simplify things foreach($this->details as $info) { foreach($info as $item => $value) { if (!isset($this->plugin_info[$item])) { $this->plugin_info[$item] = $value; continue; } if ($this->plugin_info[$item] != $value) $this->plugin_info[$item] = ''; - } - } - } - + } + } + } + function html() { - + // output the standard menu stuff parent::html(); - + // sanity check if (!$this->manager->plugin) { return; } - + ptln('<div class="pm_info">'); ptln("<h2>".$this->manager->getLang('plugin')." {$this->manager->plugin}</h2>"); // collect pertinent information from the log $installed = $this->plugin_readlog($this->manager->plugin, 'installed'); - $source = $this->plugin_readlog($this->manager->plugin, 'url'); + $source = $this->plugin_readlog($this->manager->plugin, 'url'); $updated = $this->plugin_readlog($this->manager->plugin, 'updated'); if (strrpos($updated, "\n") !== false) $updated = substr($updated, strrpos($updated, "\n")+1); - + ptln("<dl>",2); ptln("<dt>".$this->manager->getLang('source').'</dt><dd>'.($source ? $source : $this->manager->getLang('unknown'))."</dd>",4); ptln("<dt>".$this->manager->getLang('installed').'</dt><dd>'.($installed ? $installed : $this->manager->getLang('unknown'))."</dd>",4); if ($updated) ptln("<dt>".$this->manager->getLang('lastupdate').'</dt><dd>'.$updated."</dd>",4); ptln("</dl>",2); - + if (count($this->details) == 0) { ptln("<p>".$this->manager->getLang('noinfo')."</p>",2); } else { - + ptln("<dl>",2); if ($this->plugin_info['name']) ptln("<dt>".$this->manager->getLang('name')."</dt><dd>".$this->out($this->plugin_info['name'])."</dd>",4); if ($this->plugin_info['date']) ptln("<dt>".$this->manager->getLang('date')."</dt><dd>".$this->out($this->plugin_info['date'])."</dd>",4); @@ -464,55 +464,55 @@ class ap_manage { if ($this->plugin_info['author']) ptln("<dt>".$this->manager->getLang('author')."</dt><dd>".$this->manager->email($this->plugin_info['email'], $this->plugin_info['author'])."</dd>",4); if ($this->plugin_info['url']) ptln("<dt>".$this->manager->getLang('www')."</dt><dd>".$this->manager->external_link($this->plugin_info['url'], '', 'urlextern')."</dd>",4); ptln("</dl>",2); - + if (count($this->details) > 1) { ptln("<h3>".$this->manager->getLang('components')."</h3>",2); ptln("<div>",2); - + foreach ($this->details as $info) { - + ptln("<dl>",4); - ptln("<dt>".$this->manager->getLang('name')."</dt><dd>".$this->out($info['name'])."</dd>",6); + ptln("<dt>".$this->manager->getLang('name')."</dt><dd>".$this->out($info['name'])."</dd>",6); if (!$this->plugin_info['date']) ptln("<dt>".$this->manager->getLang('date')."</dt><dd>".$this->out($info['date'])."</dd>",6); if (!$this->plugin_info['type']) ptln("<dt>".$this->manager->getLang('type')."</dt><dd>".$this->out($info['type'])."</dd>",6); if (!$this->plugin_info['desc']) ptln("<dt>".$this->manager->getLang('desc')."</dt><dd>".$this->out($info['desc'])."</dd>",6); if (!$this->plugin_info['author']) ptln("<dt>".$this->manager->getLang('author')."</dt><dd>".$this->manager->email($info['email'], $info['author'])."</dd>",6); if (!$this->plugin_info['url']) ptln("<dt>".$this->manager->getLang('www')."</dt><dd>".$this->manager->external_link($info['url'], '', 'urlextern')."</dd>",6); ptln("</dl>",4); - + } ptln("</div>",2); } } ptln("</div>"); } - + // simple output filter, make html entities safe and convert new lines to <br /> function out($text) { return str_replace("\n",'<br />',htmlentities($text)); } - + } - + //--------------[ to do ]--------------------------------------- class ap_update extends ap_manage { - + var $overwrite = true; - + function process() { global $lang; - + $plugin_url = $this->plugin_readlog($this->plugin, 'url'); $this->download($plugin_url, $this->overwrite); return ''; } - + function html() { parent::html(); - + ptln('<div class="pm_info">'); ptln('<h2>'.$this->lang['updating'].'</h2>'); - + if ($this->manager->error) { ptln('<div class="error">'.str_replace("\n","<br />", $this->manager->error).'</div>'); } else if (count($this->downloaded) == 1) { @@ -531,58 +531,58 @@ class ap_manage { } } class ap_settings extends ap_manage {} - + //--------------[ utilities ]----------------------------------- - + function is_css($f) { return (substr($f, -4) == '.css'); } - - // generate an admin plugin href - function apl($pl, $fn) { - global $ID; + + // generate an admin plugin href + function apl($pl, $fn) { + global $ID; return wl($ID,"do=admin&page=plugin".($pl?"&plugin=$pl":"").($fn?"&fn=$fn":"")); } - + // decompress wrapper function ap_decompress($file, $target) { - + // decompression library doesn't like target folders ending in "/" if (substr($target, -1) == "/") $target = substr($target, 0, -1); $ext = substr($file, strrpos($file,'.')+1); - + // .tar, .tar.bz, .tar.gz, .tgz if (in_array($ext, array('tar','bz','bz2','gz','tgz'))) { - + require_once(DOKU_PLUGIN."plugin/inc/tarlib.class.php"); - + if (strpos($ext, 'bz') !== false) $compress_type = COMPRESS_BZIP; else if (strpos($ext,'gz') !== false) $compress_type = COMPRESS_GZIP; else $compress_type = COMPRESS_NONE; $tar = new CompTar($file, $compress_type); $ok = $tar->Extract(FULL_ARCHIVE, $target, '', 0777); - - // FIXME sort something out for handling tar error messages meaningfully + + // FIXME sort something out for handling tar error messages meaningfully return ($ok<0?false:true); - + } else if ($ext == 'zip') { require_once(DOKU_PLUGIN."plugin/inc/zip.lib.php"); - + $zip = new zip(); $ok = $zip->Extract($file, $target); - - // FIXME sort something out for handling zip error messages meaningfully + + // FIXME sort something out for handling zip error messages meaningfully return ($ok==-1?false:true); - + } else if ($ext == "rar") { // not yet supported -- fix me return false; } - + // unsupported file type return false; } - + // possibly should use io_MakeFileDir, not sure about using its method of error handling function ap_mkdir($d) { global $conf; @@ -593,36 +593,36 @@ class ap_manage { // copy with recursive sub-directory support function ap_copy($src, $dst) { - + if (is_dir($src)) { if (!$dh = @opendir($src)) return false; - - if ($ok = ap_mkdir($dst)) { + + if ($ok = ap_mkdir($dst)) { while ($ok && $f = readdir($dh)) { if ($f == '..' || $f == '.') continue; $ok = ap_copy("$src/$f", "$dst/$f"); } - } - + } + closedir($dh); return $ok; - + } else { if (!@copy($src,$dst)) return false; touch($dst,filemtime($src)); } - + return true; } - + // delete, with recursive sub-directory support function ap_delete($path) { - + if (!is_string($path) || $path == "") return false; - + if (is_dir($path)) { if (!$dh = @opendir($path)) return false; - + while ($f = readdir($dh)) { if ($f == '..' || $f == '.') continue; ap_delete("$path/$f"); @@ -635,31 +635,31 @@ class ap_manage { } return false; - } - + } + // return a list (name & type) of all the component plugins that make up this plugin // can this move to pluginutils? function ap_plugin_components($plugin) { global $common_plugin_types; - + $components = array(); $path = DOKU_PLUGIN.$plugin.'/'; - + foreach ($common_plugin_types as $type) { if (file_exists($path.$type.'.php')) { $components[] = array('name'=>$plugin, 'type'=>$type); continue; } - + if ($dh = @opendir($path.$type.'/')) { while (false !== ($cp = readdir($dh))) { if ($cp == '.' || $cp == '..' || strtolower(substr($cp,-4)) != '.php') continue; $components[] = array('name'=>$plugin.'_'.substr($cp, 0, -4), 'type'=>$type); } closedir($dh); - } + } } return $components; } - + function ap_component_sort($a, $b) { if ($a['name'] == $b['name']) return 0; return ($a['name'] < $b['name']) ? -1 : 1; diff --git a/lib/plugins/plugin/style.css b/lib/plugins/plugin/style.css index f9d496f2e..03f8ace19 100644 --- a/lib/plugins/plugin/style.css +++ b/lib/plugins/plugin/style.css @@ -6,42 +6,42 @@ */ /* overall containing div */ -#plugin_manager {} - -#plugin_manager h2 { margin-left: 0;} -#plugin_manager form { display: block; margin: 0; padding: 0;} -#plugin_manager legend { display: none;} -#plugin_manager .legend { color: black; display: block; margin: 0; padding: 0; font-size: 1em; line-height: 1.4em; font-weight: normal; text-align: left;} -#plugin_manager fieldset { border: 0; width: auto;} -#plugin_manager .button { margin: 0 0.3em 2px 0;} -#plugin_manager p, #plugin_manager label { text-align: left;} -#plugin_manager .hidden { display: none;} -#plugin_manager .new { background: __medium__;} -#plugin_manager input[disabled] { color: __mediumgray__; border-color: __mediumgray__;} /* IE won't understand but doesn't require it */ - -#plugin_manager .pm_menu, #plugin_manager .pm_info { margin-left: 0; text-align: left; } -#plugin_manager .pm_menu { float: left; width: 48%; } -#plugin_manager .pm_info { float: right; width: 50%; } - -#plugin_manager .common { border-bottom: 1px solid __dark__; margin-top: 1em;} -#plugin_manager .common form { border: 1px solid __dark__; border-bottom: 0;} -#plugin_manager .common fieldset { margin: 0; padding: 0;} -#plugin_manager .common .legend { background: __medium__; margin-bottom: 0.3em; padding-left: 0.5em;} -#plugin_manager .common label { padding: 0 0 0.5em 0.5em; } -#plugin_manager .common input { width: auto; margin: 0 1em;} -#plugin_manager .common .button { float: right; width: 6em; } -#plugin_manager .common p { border-bottom: 1px solid __dark__; padding: 0 0 0.5em 0.5em; margin-bottom: 0;} - -#plugin_manager .plugins { border-bottom: 1px solid __dark__;} -#plugin_manager .plugins form { border: 1px solid __dark__; border-bottom: 0;} -#plugin_manager .plugins fieldset { text-align: right; } -#plugin_manager .plugins .legend { float: left; padding: 5px 0 0 5px;} -#plugin_manager .plugins .button { width: 5em; font-size: 95%;} - -#plugin_manager .pm_info h3 { margin-left: 0; } -#plugin_manager .pm_info dl { margin: 1em 0; padding: 0;} -#plugin_manager .pm_info dt { width: 6em; float: left; clear: left; margin:0; padding: 0;} -#plugin_manager .pm_info dd { margin:0 0 0 7em; padding: 0;} +#plugin__manager {} + +#plugin__manager h2 { margin-left: 0;} +#plugin__manager form { display: block; margin: 0; padding: 0;} +#plugin__manager legend { display: none;} +#plugin__manager .legend { color: black; display: block; margin: 0; padding: 0; font-size: 1em; line-height: 1.4em; font-weight: normal; text-align: left;} +#plugin__manager fieldset { border: 0; width: auto;} +#plugin__manager .button { margin: 0 0.3em 2px 0;} +#plugin__manager p, #plugin__manager label { text-align: left;} +#plugin__manager .hidden { display: none;} +#plugin__manager .new { background: __medium__;} +#plugin__manager input[disabled] { color: __mediumgray__; border-color: __mediumgray__;} /* IE won't understand but doesn't require it */ + +#plugin__manager .pm_menu, #plugin__manager .pm_info { margin-left: 0; text-align: left; } +#plugin__manager .pm_menu { float: left; width: 48%; } +#plugin__manager .pm_info { float: right; width: 50%; } + +#plugin__manager .common { border-bottom: 1px solid __dark__; margin-top: 1em;} +#plugin__manager .common form { border: 1px solid __dark__; border-bottom: 0;} +#plugin__manager .common fieldset { margin: 0; padding: 0;} +#plugin__manager .common .legend { background: __medium__; margin-bottom: 0.3em; padding-left: 0.5em;} +#plugin__manager .common label { padding: 0 0 0.5em 0.5em; } +#plugin__manager .common input { width: auto; margin: 0 1em;} +#plugin__manager .common .button { float: right; width: 6em; } +#plugin__manager .common p { border-bottom: 1px solid __dark__; padding: 0 0 0.5em 0.5em; margin-bottom: 0;} + +#plugin__manager .plugins { border-bottom: 1px solid __dark__;} +#plugin__manager .plugins form { border: 1px solid __dark__; border-bottom: 0;} +#plugin__manager .plugins fieldset { text-align: right; } +#plugin__manager .plugins .legend { float: left; padding: 5px 0 0 5px;} +#plugin__manager .plugins .button { width: 5em; font-size: 95%;} + +#plugin__manager .pm_info h3 { margin-left: 0; } +#plugin__manager .pm_info dl { margin: 1em 0; padding: 0;} +#plugin__manager .pm_info dt { width: 6em; float: left; clear: left; margin:0; padding: 0;} +#plugin__manager .pm_info dd { margin:0 0 0 7em; padding: 0;} /* end admin plugin styles */ |