RPOWER Wiki Notebook

From RPOWERWiki

Jump to: navigation, search

This page contains information and notes about RPOWER's Wiki configuration and PHP programming.

Contents

Indented Literal ("pre") Text

"Failsafe" modifications in newer MediaWiki does not allow literal text, such as

This is literal text

to show up inside a bulleted or numbered list. For example,

  • Item Number 1

    Item 1 literal line 1
    Item 1 literal line 2
    

  • Item Number 2

Without the change, the above text is clearly incorrect.

MediaWiki Bulleted and Numbered Lists

We fix three problems with MediaWiki's list handling:

  1. Inability to generate "lettered" ordered lists.
  2. Inability to "continue" a numbering/indentation level with a new paragraph after an intervening bulleted or numbered sub-list.
  3. Inability to display literal ("pre") text in newer MediaWiki.

For example, we want to create:

1. Item number 1.

   a. Item letter a.

   b. Item letter b.

2. Item number 2.

We can now do this by adding a single "type" character after the first # in the source text. The character is passed as the type= attribute in the HTML <ol> tag. Supported characters are A, a, I, i, and 1, for uppercase lettered, lowercase lettered, uppercase roman numeral, lowercase roman numeral, and just regular numbered, respectively. The last, 1, is redundant as it is the default.

Type characters after the first # in a list are ignored. The following Wiki text creates the above example:

# Item Number 1.
##a Item letter a.
## Item letter b.
# Item Number 2.

The second issue regards the problem of wanting this:

1. Item number 1.

   a. Item letter a.

   b. Item letter b.

   Item number 1 continued.

2. Item number 2.

but getting this:

1. Item number 1.

   a. Item letter a.

   b. Item letter b.

2. Item number 1 continued.

3. Item number 2.

using this Wiki text:

# Item Number 1.
##a Item letter a.
## Item letter b.
# Item number 1 continued.
# Item Number 2.

The modification extends the Wiki list syntax to allow a - after the list character to continue a list already at that level, to wit:

# Item Number 1.
##a Item letter a.
## Item letter b.
#- Item number 1 continued.
# Item Number 2.

Changes to includes\parser\Parser.php

In includes\parser\Parser.php:

  • Change this:
   /* private */ function closeParagraph() {
      $result = '';
      if ( '' != $this->mLastSection ) {
         $result = '</' . $this->mLastSection  . ">\n";
--    }
>>    $this->mInPre = false;
--    $this->mLastSection = '';
      return $result;

to this:

   /* private */ function closeParagraph() {
      $result = '';
      if ( '' != $this->mLastSection ) {
         $result = '</' . $this->mLastSection  . ">\n";
--    }
>>    # $this->mInPre = false;
--    $this->mLastSection = '';
      return $result;
  • Change this:
   # These next three functions open, continue, and close the list
   # element appropriate to the prefix character passed into them.
-- #
>>    /* private */ function openList( $char ) {
--       $result = $this->closeParagraph();

--       if ( '*' == $char ) { $result .= '<ul><li>'; }
>>       else if ( '#' == $char ) { $result .= '<ol><li>'; }
--       else if ( ':' == $char ) { $result .= '<dl><dd>'; }
         else if ( ';' == $char ) {
            $result .= '<dl><dt>';
            $this->mDTopen = true;
         }
         else { $result = '<!-- ERR 1 -->'; }

         return $result;
   }

to this:

   # These next three functions open, continue, and close the list
   # element appropriate to the prefix character passed into them.
-- #
>> /* private */ function openList( $char , $olTag ) {
--    $result = $this->closeParagraph();

--    if ( '*' == $char ) { $result .= '<ul><li>'; }
>>    else if ( '#' == $char ) { $result = $result . $olTag . '<li>';
--    else if ( ':' == $char ) { $result .= '<dl><dd>'; }
      else if ( ';' == $char ) {
         $result .= '<dl><dt>';
         $this->mDTopen = true;
      }
      else { $result = '<!-- ERR 1 -->'; }

      return $result;
}
  • Change this:
   foreach ( $textLines as $oLine ) {
      $lastPrefixLength = strlen( $lastPrefix );
      $preCloseMatch = preg_match('/<\\/pre/i', $oLine );
--    $preOpenMatch = preg_match('/<pre/i', $oLine );
--    if ( !$this->mInPre ) {
         # Multiple prefixes may abut each other for nested lists.
         $prefixLength = strspn( $oLine, '*#:;' );
         $pref = substr( $oLine, 0, $prefixLength );

         # eh?
         $pref2 = str_replace( ';', ':', $pref );
--       $t = substr( $oLine, $prefixLength );
--       $this->mInPre = !empty($preOpenMatch);
      } else {
         # Don't interpret any other prefixes in preformatted text
         $prefixLength = 0;
         $pref = $pref2 = '';
         $t = $oLine;
      }

      # List generation
      if( $prefixLength && 0 == strcmp( $lastPrefix, $pref2 ) ) {
--       # Same as the last item, so no need to deal with nesting or opening stuff
>>       $output .= $this->nextItem( substr( $pref, -1 ) );
--       $paragraphStack = false;

         if ( substr( $pref, -1 ) == ';') {
            # The one nasty exception: definition lists work like this:
            # ; title : definition text
            # So we check for : in the remainder text to split up the
            # title and definition, without b0rking links.
            $term = $t2 = '';
            if ($this->findColonNoLinks($t, $term, $t2) !== false) {
               $t = $t2;
               $output .= $term . $this->nextItem( ':' );
            }
--       }
>>    } elseif( $prefixLength || $lastPrefixLength ) {
--       # Either open or close a level...
         $commonPrefixLength = $this->getCommon( $pref, $lastPrefix );
         $paragraphStack = false;

         while( $commonPrefixLength < $lastPrefixLength ) {
            $output .= $this->closeList( $lastPrefix{$lastPrefixLength-1} );
            --$lastPrefixLength;
--       }
>>       if ( $prefixLength <= $commonPrefixLength && $commonPrefixLength > 0 ) {
--          $output .= $this->nextItem( $pref{$commonPrefixLength-1} );
         }
         while ( $prefixLength > $commonPrefixLength ) {
--          $char = substr( $pref, $commonPrefixLength, 1 );
>>          $output .= $this->openList( $char );
--
            if ( ';' == $char ) {
               # FIXME: This is dupe of code above
               if ($this->findColonNoLinks($t, $term, $t2) !== false) {
                  $t = $t2;
                  $output .= $term . $this->nextItem( ':' );
               }
            }
            ++$commonPrefixLength;
         }
         $lastPrefix = $pref2;
      }
      if( 0 == $prefixLength ) {

to this:

   foreach ( $textLines as $oLine ) {
      $lastPrefixLength = strlen( $lastPrefix );
      $preCloseMatch = preg_match('/<\\/pre/i', $oLine );
--    $preOpenMatch = preg_match('/<pre/i', $oLine );
>>    $nextItemContinue = false;
>>    $wasInPre = $this->mInPre;
>>    $olTag = "<ol>";
--    if ( !$this->mInPre ) {
         # Multiple prefixes may abut each other for nested lists.
         $prefixLength = strspn( $oLine, '*#:;' );
         $pref = substr( $oLine, 0, $prefixLength );

         # eh?
         $pref2 = str_replace( ';', ':', $pref );
--       $t = substr( $oLine, $prefixLength );
>>       if ( $prefixLength ) {
>>          $c = substr($t, 0, 1);
>>          if ( strpos('1aAiI', $c) !== false ) {
>>             $olTag = '<ol type="' . $c . '">';
>>             $t = substr ( $t , 1 );
>>          }
>>          else if ( '-' == $c ) {
>>             $nextItemContinue = true;
>>             $t = substr ( $t , 1 );
>>          }
>>          while ( substr( $t , 0 , 1 ) == ' ' ) $t = substr ( $t , 1 );
>>       }
--       $this->mInPre = !empty($preOpenMatch);
      } else {
         # Don't interpret any other prefixes in preformatted text
         $prefixLength = 0;
         $pref = $pref2 = '';
         $t = $oLine;
      }

      # List generation
      if( $prefixLength && 0 == strcmp( $lastPrefix, $pref2 ) ) {
--       # Same as the last item, so no need to deal with nesting or opening stuff
>>       if ( !$nextItemContinue )
>>          $output .= $this->nextItem( substr( $pref, -1 ) );
--       $paragraphStack = false;

         if ( substr( $pref, -1 ) == ';') {
            # The one nasty exception: definition lists work like this:
            # ; title : definition text
            # So we check for : in the remainder text to split up the
            # title and definition, without b0rking links.
            $term = $t2 = '';
            if ($this->findColonNoLinks($t, $term, $t2) !== false) {
               $t = $t2;
               $output .= $term . $this->nextItem( ':' );
            }
--       }
>>    } elseif( !$wasInPre && ($prefixLength || $lastPrefixLength) ) {
--       # Either open or close a level...
         $commonPrefixLength = $this->getCommon( $pref, $lastPrefix );
         $paragraphStack = false;

         while( $commonPrefixLength < $lastPrefixLength ) {
            $output .= $this->closeList( $lastPrefix{$lastPrefixLength-1} );
            --$lastPrefixLength;
--       }
>>       if ( !$nextItemContinue &&
>>            $prefixLength <= $commonPrefixLength && $commonPrefixLength > 0 ) {
--          $output .= $this->nextItem( $pref{$commonPrefixLength-1} );
         }
         while ( $prefixLength > $commonPrefixLength ) {
--          $char = substr( $pref, $commonPrefixLength, 1 );
>>          $output .= $this->openList( $char , $olTag );
--
            if ( ';' == $char ) {
               # FIXME: This is dupe of code above
               if ($this->findColonNoLinks($t, $term, $t2) !== false) {
                  $t = $t2;
                  $output .= $term . $this->nextItem( ':' );
               }
            }
            ++$commonPrefixLength;
         }
         $lastPrefix = $pref2;
      }
      if( 0 == $prefixLength ) {

Pretty URLs

Edit LocalSettings.php in mediawiki and find $wgScriptPath. Underneath that set $wgArticlePath= to your desired path. For example:

$wgScriptPath       = "/wiki";
$wgArticlePath      = "/pos-wiki/$1";
$wgUsePathInfo      = true;

Thumbnails (using ImageMagick)

Install ImageMagick at the same directory level as mediawiki (that is, the ImageMagic folder and mediawiki folders are in the same folder). Note the spelling difference in the folder name.

Edit LocalSettings.php in mediawiki and set the ImageMagic convert.exe path.

On the server, find cmd.exe in the Windows SYSTEM32 directory and give the Internet Guest Account (IUSR_...) Read and Read & Execute security privileges to it.

If you still get an "Error creating thumbnail:" (with no other explanation), it's because MediaWiki is trying to work around an bug in old PHP and PHP has now been fixed. Change includes\GlobalFunctions.php from this

} elseif ( php_uname( 's' ) == 'Windows NT' ) {
   # This is a hack to work around PHP's flawed invocation of cmd.exe
   # http://news.php.net/php.internals/21796
   $cmd = '"' . $cmd . '"';
}

to this:

}
# elseif ( php_uname( 's' ) == 'Windows NT' ) {
#    # This is a hack to work around PHP's flawed invocation of cmd.exe
#    # http://news.php.net/php.internals/21796
#    $cmd = '"' . $cmd . '"';
# }

or just delete the code after elseif.

Delete Page or Image Error

One can get a SQL error when deleting an article or image. In includes\Article.php:

  • Change This
    // In the future, we may keep revisions and mark them with
    // the rev_deleted field, which is reserved for this purpose.
    $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
       array(
          'ar_namespace'  => 'page_namespace',
          'ar_title'      => 'page_title',
          'ar_comment'    => 'rev_comment',
          'ar_user'       => 'rev_user',
          'ar_user_text'  => 'rev_user_text',
          'ar_timestamp'  => 'rev_timestamp',
          'ar_minor_edit' => 'rev_minor_edit',
          'ar_rev_id'     => 'rev_id',
          'ar_text_id'    => 'rev_text_id',
       ), array(
          'page_id' => $id,
          'page_id = rev_page'
       ), $fname
    );

to this:

    // In the future, we may keep revisions and mark them with
    // the rev_deleted field, which is reserved for this purpose.
    $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
       array(
          'ar_namespace'  => 'page_namespace',
--        'ar_title'      => 'page_title',
>>        'ar_text'       => '""',
--        'ar_comment'    => 'rev_comment',
          'ar_user'       => 'rev_user',
          'ar_user_text'  => 'rev_user_text',
          'ar_timestamp'  => 'rev_timestamp',
--        'ar_minor_edit' => 'rev_minor_edit',
>>        'ar_flags'      => '""',
--        'ar_rev_id'     => 'rev_id',
          'ar_text_id'    => 'rev_text_id',
       ), array(
          'page_id' => $id,
          'page_id = rev_page'
       ), $fname
    );

Old Revision and Text Cleanup

The following files contain, among other things, modifications that work around a bug in the MySQL NOT IN SQL statement. DeleteOldRevisions.php chains to PurgeOldText.php when --delete is set.

A batch file can be created to run this like:

@echo off
c:\php\php.exe c:\Inetpub\wiki\mediawiki\maintenance\deleteOldRevisions.php --delete

The batch file can then be run as a Windows Scheduled Task.

DeleteOldRevisions.php

<?php

/**
 * Delete old (non-current) revisions from the database
 *
 * @package MediaWiki
 * @subpackage Maintenance
 * @author Rob Church <robchur@gmail.com>
 */

$options = array( 'delete', 'help' );
require_once( 'commandLine.inc' );
require_once( 'deleteOldRevisions.inc' );

echo( "Delete Old Revisions\n\n" );

if( @$options['help'] ) {
   ShowUsage();
} else {
   DeleteOldRevisions( @$options['delete'] );
}

function ShowUsage() {
   echo( "Deletes non-current revisions from the database.\n\n" );
   echo( "Usage: php deleteOldRevisions.php [--delete|--help]\n\n" );
   echo( "delete : Performs the deletion\n" );
   echo( "  help : Show this usage information\n" );
}

?>

DeleteOldRevisions.inc

<?php

/**
 * Support functions for the deleteOldRevisions script
 *
 * @package MediaWiki
 * @subpackage Maintenance
 * @author Rob Church <robchur@gmail.com>
 */

require_once( 'purgeOldText.inc' );

function DeleteOldRevisions( $delete = false ) {

   # Data should come off the master, wrapped in a transaction
   $dbw =& wfGetDB( DB_MASTER );
   $dbw->begin();

   $tbl_pag = $dbw->tableName( 'page' );
   $tbl_rev = $dbw->tableName( 'revision' );

   # Get all revisions that aren't in this set
   echo( "Searching for inactive revisions..." );

   $res = $dbw->query( "SELECT rev_id FROM $tbl_rev WHERE rev_id NOT IN (SELECT page_latest FROM $tbl_pag)" );
   while( $row = $dbw->fetchObject( $res ) ) {
      $old[] = $row->rev_id;
   }
   # Inform the user of what we're going to do
   $count = count( $old );
   echo( "$count old revisions found.\n" );

   $set = implode( ', ', $old );
   // echo( "Old: $set\n" );

   # Delete as appropriate
   if( $delete && $count ) {
      echo( "Deleting..." );
      $dbw->query( "DELETE FROM $tbl_rev WHERE rev_id IN ( $set )" );
      $dbw->query( "OPTIMIZE TABLE $tbl_rev");
      echo( "done.\n" );
   }

   # This bit's done
   # Purge redundant text records
   $dbw->commit();
   if( $delete ) {
      PurgeRedundantText( true );
   }

}

?>

PurgeOldText.php

<?php

/**
 * Purge old text records from the database
 *
 * @package MediaWiki
 * @subpackage Maintenance
 * @author Rob Church <robchur@gmail.com>
 */

$options = array( 'purge', 'help' );
require_once( 'commandLine.inc' );
require_once( 'purgeOldText.inc' );

echo( "Purge Old Text\n\n" );

if( @$options['help'] ) {
   ShowUsage();
} else {
   PurgeRedundantText( @$options['purge'] );
}

function ShowUsage() {
   echo( "Prunes unused text records from the database.\n\n" );
   echo( "Usage: php purgeOldText.php [--purge]\n\n" );
   echo( "purge : Performs the deletion\n" );
   echo( " help : Show this usage information\n" );
}

?>

PurgeOldText.inc

<?php

/**
 * Support functions for cleaning up redundant text records
 *
 * @package MediaWiki
 * @subpackage Maintenance
 * @author Rob Church <robchur@gmail.com>
 */

function PurgeRedundantText( $delete = false ) {

   # Data should come off the master, wrapped in a transaction
   $dbw =& wfGetDB( DB_MASTER );
   $dbw->begin();

   $tbl_arc = $dbw->tableName( 'archive' );
   $tbl_rev = $dbw->tableName( 'revision' );
   $tbl_txt = $dbw->tableName( 'text' );

   echo( "Searching for inactive text records..." );
   $res = $dbw->query( "SELECT old_id FROM $tbl_txt WHERE old_id NOT IN (SELECT DISTINCTROW rev_text_id FROM $tbl_rev UNION DISTINCT SELECT DISTINCTROW ar_text_id FROM $tbl_arc)" );
   while( $row = $dbw->fetchObject( $res ) ) {
      $old[] = $row->old_id;
   }
   echo( "done.\n" );

   # Inform the user of what we're going to do
   $count = count( $old );
   echo( "$count inactive items found.\n" );

   $set = implode( ', ', $old );
   // echo( "Old: $set" );

   # Delete as appropriate
   if( $delete && $count ) {
      echo( "Deleting..." );
      $dbw->query( "DELETE FROM $tbl_txt WHERE old_id IN ( $set )" );
      echo( "done.\n" );
      $dbw->query( "OPTIMIZE TABLE $tbl_txt");
   }

   # Done
   $dbw->commit();

}

?>

PHP REQUEST_URI Problem in Windows

Replace all:

 _SERVER['REQUEST_URI']

with:

 _SERVER['SCRIPT_NAME']

in the following files:

  • index.php (1)
  • includes\GlobalFunctions.php (1)
  • includes\Setup.php (3)
  • includes\Skin.php (1)
  • includes\WebRequest.php (1)

RPOWER's LocalSettings.php

Note in particular the wgGroupPermissions on the bottom to prevent anonymous editing and spamming.

<?php

# This file was automatically generated by the MediaWiki installer.
# If you make manual changes, please keep track in case you need to
# recreate them later.
#
# See includes/DefaultSettings.php for all configurable settings
# and their default values, but don't forget to make changes in _this_
# file, not there.
#
# Further documentation for configuration settings may be found at:
# http://www.mediawiki.org/wiki/Manual:Configuration_settings

# If you customize your file layout, set $IP to the directory that contains
# the other MediaWiki files. It will be used as a base to locate files.
if( defined( 'MW_INSTALL_PATH' ) ) {
  $IP = MW_INSTALL_PATH;
} else {
  $IP = dirname( __FILE__ );
}

$path = array( $IP, "$IP/includes", "$IP/languages" );
set_include_path( implode( PATH_SEPARATOR, $path ) . PATH_SEPARATOR . get_include_path() );

require_once( "$IP/includes/DefaultSettings.php" );

# If PHP's memory limit is very low, some operations may fail.
# ini_set( 'memory_limit', '20M' );

if ( $wgCommandLineMode ) {
  if ( isset( $_SERVER ) && array_key_exists( 'REQUEST_METHOD', $_SERVER ) ) {
    die( "This script must be run from the command line\n" );
  }
}
## Uncomment this to disable output compression
# $wgDisableOutputCompression = true;

$wgUploadSizeWarning = 1024 * 1024;

$wgSitename         = "RPOWERWiki";

## The URL base path to the directory containing the wiki;
## defaults for all runtime URL paths are based off of this.
## For more information on customizing the URLs please see:
## http://www.mediawiki.org/wiki/Manual:Short_URL
$wgScriptPath       = "/wiki";
$wgArticlePath      = "/pos-wiki/$1";
$wgUsePathInfo      = true;
$wgScriptExtension  = ".php";

## UPO means: this is also a user preference option

$wgEnableEmail      = false;
$wgEnableUserEmail  = false; # UPO

$wgEmergencyContact = "root@localhost";
$wgPasswordSender = "root@localhost";

$wgEnotifUserTalk = false; # UPO
$wgEnotifWatchlist = false; # UPO
$wgEmailAuthentication = false;

## Database settings
$wgDBtype           = "mysql";
$wgDBserver         = "localhost";
$wgDBname           = "wikidb";
$wgDBuser           = "wikiuser";
$wgDBpassword       = "yo11yo11";

# MySQL specific settings
$wgDBprefix         = "mw_";

# MySQL table options to use during installation or update
$wgDBTableOptions   = "ENGINE=MyISAM, DEFAULT CHARSET=binary";

# Experimental charset support for MySQL 4.1/5.0.
$wgDBmysql5 = true;

## Shared memory settings
$wgMainCacheType = CACHE_NONE;
$wgMemCachedServers = array();

## To enable image uploads, make sure the 'images' directory
## is writable, then set this to true:

# $wgDebugLogFile = "C:\\Z\\bfd1\\Inetpub\\wiki\\debug.txt";

$wgEnableUploads  = true;
$wgUseImageResize = true;
$wgUseImageMagick = true;
$wgImageMagickConvertCommand = "C:\\Z\\bfd1\\Inetpub\\wiki\\ImageMagic\\convert.exe";

## If you use ImageMagick (or any other shell command) on a
## Linux server, this will need to be set to the name of an
## available UTF-8 locale
# $wgShellLocale = "en_US.UTF-8";

## If you want to use image uploads under safe mode,
## create the directories images/archive, images/thumb and
## images/temp, and make them all writable. Then uncomment
## this, if it's not already uncommented:
# $wgHashedUploadDirectory = false;

## If you have the appropriate support software installed
## you can enable inline LaTeX equations:
$wgUseTeX           = false;

$wgLocalInterwiki   = strtolower( $wgSitename );

$wgLanguageCode = "en";

$wgSecretKey = "51f591058faf8ad399cc8912a11188053173a402cd37ac27e58bfab5066ee31";

## Default skin: you can change the default skin. Use the internal symbolic
## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook':
$wgDefaultSkin = 'monobook';

## For attaching licensing metadata to pages, and displaying an
## appropriate copyright notice / icon. GNU Free Documentation
## License and Creative Commons licenses are supported so far.
# $wgEnableCreativeCommonsRdf = true;
$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright
$wgRightsUrl = "";
$wgRightsText = "";
$wgRightsIcon = "";
# $wgRightsCode = ""; # Not yet used

$wgDiff3 = "";

## Permission keys given to users in each group.
## All users are implicitly in the '*' group including anonymous visitors;
## logged-in users are all implicitly in the 'user' group. These will be
## combined with the permissions of all groups that a given user is listed
## in in the user_groups table.
##
## This replaces wgWhitelistAccount and wgWhitelistEdit

$wgGroupPermissions['*']['createaccount'] = false;
$wgGroupPermissions['*']['createpage']    = false;
$wgGroupPermissions['*']['edit']          = false;

# When you make changes to this configuration file, this will make
# sure that cached pages are cleared.
$wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', @filemtime( __FILE__ ) ) );

?>

RPOWER Style Sheet Examples

A full copy of the main.css style sheet is at the end of this document.

Tables

The bottom margin of our tables to zero. This is different from Wikipedia, that sets it to 1em. This is to allow table notes under a table, to wit:

Sample Table With Note
Column 1 Column 2
Row 1 Item A Item B
Row 2 Item C Item D
  • This is a table note.

This table, on the other hand, just has a <br> after it:

Sample Table
Column 1 Column 2
Row 1 Item A Item B
Row 2 Item C Item D


so that this text isn't too near the bottom of the table.

RPOWER's MediaWiki Pages and Settings

MediaWiki:Sidebar

In the Wiki itself, search for MediaWiki:Sidebar. Edit it (as a sysop). Then change:

* navigation
** mainpage|mainpage
** portal-url|portal
** currentevents-url|currentevents
** recentchanges-url|recentchanges
** randompage-url|randompage
** helppage|help
** sitesupport-url|sitesupport

to:

* Site Navigation
** mainpage|Main Contents
** Product|Product
** Update History|Update History
** helppage|Help

Remove Article Tabs for Non-Logged Users

In skins\MonoBook.php, change:

   <div id="p-cactions" class="portlet">
     <h5><?php $this->msg('views') ?></h5>
--   <ul>
>>     <?php foreach($this->data['content_actions'] as $key => $action) {
--        ?><li id="ca-<?php echo htmlspecialchars($key) ?>"
          <?php if($action['class']) { ?>class="<?php echo htmlspecialchars ...
          ><a href="<?php echo htmlspecialchars($action['href']) ?>"><?php
          echo htmlspecialchars($action['text']) ?></a></li><?php
        } ?>
     </ul>
   </div>

to:

   <div id="p-cactions" class="portlet">
     <h5><?php $this->msg('views') ?></h5>
--   <ul>
>>     <?php if($this->data['loggedin']==1)
>>        foreach($this->data['content_actions'] as $key => $action) {
--        ?><li id="ca-<?php echo htmlspecialchars($key) ?>"
          <?php if($action['class']) { ?>class="<?php echo htmlspecialchars ...
          ><a href="<?php echo htmlspecialchars($action['href']) ?>"><?php
          echo htmlspecialchars($action['text']) ?></a></li><?php
        } ?>
     </ul>
   </div>

The edit tabs will be hidden by the main page. We need to "float" the tabs to the right, so that in order to access the tabs, you just stretch the browser to the right and there they are!

In skins\monobook\main.css, add float: right here:

#p-cactions .pBody {
  font-size: 1em;
  background-color: transparent;
  color: inherit;
  border-collapse: inherit;
  border: 0;
  padding: 0;
  float: right;
}

Remove Section Edit Links for All Users

In skins\monobook\main.css, we added

.editsection { display: none; }

in front of:

a {
    text-decoration: none;
    color: #002bb8;
    background: none;
}

To remove edit links just for non-logged users — which we don't do at this time — in skins\MonoBook.php, you would add:

<?php if(!$this->data['loggedin']) { ?>
      <style>
        <!--
        .editsection { display: none; }
        -->
      </style>
<?php } ?>

in front of:

</head>

RPOWER's Full skins\monobook\main.css Style Sheet

/*
** MediaWiki 'monobook' style sheet for CSS2-capable browsers.
** Copyright Gabriel Wicke - http://wikidev.net/
** License: GPL (http://www.gnu.org/copyleft/gpl.html)
**
** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John
** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher,
** Michael Zeltner and Geir B�kholt)
** All you guys rock :)
*/

#column-content {
   width: 100%;
   float: right;
   margin: 0 0 .6em -12.2em;
   padding: 0;
}

#column-one {
   padding-top: 160px;
}

#content {
   /* -top -right -bottom -left */

   /* margin: 2.8em 0 0 12.2em; k3 */
   /* padding: 0 1em 1em 1em; k3 */
   margin:  1.0em 0.5em 0.0em 12.2em; /* k3 */
   padding: 0.0em 1.0em 1.0em 1.0em; /* k3 */

   position: relative;
   z-index: 2;

   background: white;
   color: black;

   max-width: 740px; /* new k3 */
   border: 2px solid #aaa; /* k3 was 1px */

   /* border-right: none; removed k3 */
   line-height: 1.4em; /* k3 was 1.5em */
}
/* the left column width is specified in class .portlet */

/* Font size:
** We take advantage of keyword scaling- browsers won't go below 9px
** More at http://www.w3.org/2003/07/30-font-size
** http://style.cleverchimp.com/font_size_intervals/altintervals.html
*/

body {
   font: x-small sans-serif;
   /* font-family: Segoe UI, Verdana, sans-serif; /* new k3 */ */
   font-family: Arial, Verdana, sans-serif; /* new k3 */
   background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
   color: black;
   margin: 0;
   padding: 0;
}

/* scale back up to a sane default */
#globalWrapper {
   font-size: 127%;
   width: 100%;
   margin: 0;
   padding: 0;
}
.visualClear {
   clear: both;
}

/* general styles */

table {
   font-size: 100%;
   color: black;
   /* we don't want the bottom borders of <h2>s to be visible through
      floated tables */
   background-color: white;
}

fieldset table {
   /* but keep table layouts in forms clean... */
   background: none;
}

/* begin new k3 */

   table.wikitable,
   table.prettytable {
     background: #f4f4f9;
     border: 1px #aaaaaa solid;
     border-collapse: collapse;
   }

   table.wikitable th, table.wikitable td,
   table.prettytable th, table.prettytable td {
     border: 1px #aaaaaa solid;
     padding: 0.2em;
   }

   table.wikitable th,
   table.prettytable th {
     background: #d5d5e9;
     text-align: center;
     font-family: Verdana, sans-serif;
     font-size: 8pt;
   }

   table.wikitable td,
   table.prettytable td {
       font-family: Verdana, sans-serif;
       font-size: 8pt;
   }

   table.wikitable caption,
   table.prettytable caption {
     margin-left: inherit;
     margin-right: inherit;
   }

   .editsection { display: none; }

/* end new k3 */

a {
   text-decoration: none;
   color: #002bb8;
   background: none;
}
a:visited {
   color: #5a3696;
}
a:active {
   color: #faa700;
}
a:hover {
   text-decoration: underline;
}
a.stub {
   color: #772233;
}
a.new, #p-personal a.new {
   color: #ba0000;
}
a.new:visited, #p-personal a.new:visited {
   color: #a55858;
}

img {
   border: none;
   vertical-align: middle;
}
p {
   /* -top -right -bottom -left */
   /* margin: .4em 0 .5em 0; was k3 */
   margin: .8em 0 .8em 0;
   line-height: 1.4em; /* k3 was 1.5em */
}
p img {
   margin: 0;
}

hr {
   height: 1px;
   color: #aaa;
   background-color: #aaa;
   border: 0;
   margin: .2em 0 .2em 0;
}

h1, h2, h3, h4, h5, h6 {
   font-family: Helvetica, Arial, sans-serif; /* new k3 */
   color: black;
   background: none;
   font-weight: bold; /* k3 was normal; */
   margin: 0;
   padding-top: .5em;
   padding-bottom: .17em;
   border-bottom: 1px solid #aaa;
}

/* k3 was
h1 { font-size: 188%; }
h1 .editsection { font-size: 53%; }
h2 { font-size: 150%; }
h2 .editsection { font-size: 67%; }
h3, h4, h5, h6 {
   border-bottom: none;
   font-weight: bold;
}
h3 { font-size: 132%; }
h3 .editsection { font-size: 76%; font-weight: normal; }
h4 { font-size: 116%; }
h4 .editsection { font-size: 86%; font-weight: normal; }
h5 { font-size: 100%; }
h5 .editsection { font-weight: normal; }
h6 { font-size: 80%;  }
h6 .editsection { font-size: 125%; font-weight: normal; }
*/

/* begin change k3 */

   h1 { font-size: 173%; }
   h2 { font-size: 144%; }
   h3, h4, h5, h6 { border-bottom: none; }
   h3 { font-size: 144%;
        font-weight: normal; }
   h4 { font-size: 120%; }
   h5 { font-size: 120%;
        font-style: italic; }
   h6 { font-size: 100%;
        text-decoration: underline;
        padding-bottom: 0; }

/* end change k3 */

/* k3 was

ul {
   line-height: 1.5em;
   list-style-type: square;
   margin: .3em 0 0 1.5em;
   padding: 0;
   list-style-image: url(bullet.gif);
}
ol {
   line-height: 1.5em;
   margin: .3em 0 0 3.2em;
   padding: 0;
   list-style-image: none;
}
li {
   margin-bottom: .1em;
}
dt {
   font-weight: bold;
   margin-bottom: .1em;
}
dl {
   margin-top: .2em;
   margin-bottom: .5em;
}
dd {
   line-height: 1.5em;
   margin-left: 2em;
   margin-bottom: .1em;
}

*/

/* begin change k3 */

   ul {
       line-height: 1.4em;
       list-style-type: square;
       /* -top -right -bottom -left */
       /* margin-left: 2em; */
       /* margin-right: 2em; */
       margin: .8em 2em .8em 2em;
       padding: 0;
       list-style-image: url(bullet.gif);
   }
   ul ul {
       margin-left: 1em;
   }
   ul ol {
       margin-left: 2em;
   }

   ul p {
       margin-left: 0em;
   }

   ol {
       line-height: 1.4em;
       /* margin-left: 3em; */
       /* margin-right: 2em; */
       margin: .8em 2em .8em 3em;
       padding: 0;
       list-style-image: none;
   }
   ol ol {
       margin-left: 2em;
   }
   ol ul {
       margin-left: 1em;
   }
   ol p {
       margin-left: 0em;
   }

   li {
      margin-top: .8em;
      margin-bottom: .8em;
   }
   dl {
       margin-top: .8em;
       margin-left: .8em;
   }
   dt {
       font-weight: bold;
       margin-bottom: .2em;
   }
   dd {
       line-height: 1.4em;
       margin-left: 2em;
       margin-right: 4em;
       margin-bottom: 1em;
   }
   dd p {
       margin-left: 0em;
   }

/* end change k3 */

fieldset {
   border: 1px solid #2f6fab;
   margin: 1em 0 1em 0;
   padding: 0 1em 1em;
   line-height: 1.5em;
}
fieldset.nested {
   margin: 0 0 0.5em 0;
   padding: 0 0.5em 0.5em;
}
legend {
   padding: .5em;
   font-size: 95%;
}
form {
   border: none;
   margin: 0;
}

textarea {
   width: 100%;
   padding: .1em;
}

input.historysubmit {
   padding: 0 .3em .3em .3em !important;
   font-size: 94%;
   cursor: pointer;
   height: 1.7em !important;
   margin-left: 1.6em;
}
select {
   vertical-align: top;
}
abbr, acronym, .explain {
   border-bottom: 1px dotted black;
   color: black;
   background: none;
   cursor: help;
}
q {
   font-family: Times, "Times New Roman", serif;
   font-style: italic;
}
/* disabled for now
blockquote {
   font-family: Times, "Times New Roman", serif;
   font-style: italic;
}*/


/* k3 changed
pre {
   padding: 1em;
   border: 1px dashed #2f6fab;
   color: black;
   background-color: #f9f9f9;
   line-height: 1.1em;
}
/*

/* begin k3 change */

   pre {
       font-family: Lucida Console, Courier New, Courier, monospace;
       font-size: 10pt;
       padding: 1em;
       border: 1px dashed #2f6fab;
       color: DarkGreen; /* Green, DarkGreen */
       background-color: #f4f4f9;
       line-height: 1.2em;
   }

/* end k3 change */

code { /* $screen text$ */
    /*font-family: Lucida Console, Courier New, Courier, monospace;*/
    font-family: Helvetica, Arial, sans-serif;
    font-weight: bold;
    font-style: normal;
    /*background-color: WhiteSmoke;*/ /* WhiteSmoke, Gainsboro, LightGrey, Silver */
    color: DarkGreen; /* Green, DarkGreen */
    /* border: 1px dashed #2f6fab; */
    /* padding-left: .2em; */
    /* padding-right: .2em; */
    padding-top: .0em;
    padding-bottom: .0em;
}
table code {
   border: none;
}
tt { /* #keystroke text */
    font-family: Helvetica, Arial, sans-serif;
    font-weight: bold;
    font-style: normal;
    padding-left: .2em;
    padding-right: .2em;
    background-color: DimGray; /* Black, DimGray, Gray, DarkGray */
    color: White;
    border: 1px solid Black;
}
cite { /* @button text@ */
    font-family: Helvetica, Arial, sans-serif;
    font-weight: bold;
    font-style: normal;
    padding-left: .2em;
    padding-right: .2em;
    background-color: WhiteSmoke; /* WhiteSmoke, Gainsboro, LightGrey, Silver */
    color: DimGray;
    border: 1px solid Black;
}
var { /* ~user-typed text~ */
    font-family: Lucida Console, Courier New, Courier, monospace;
    font-size: 10pt;
    /*background-color: WhiteSmoke;*/ /* WhiteSmoke, Gainsboro, LightGrey, Silver */
    padding-left: .2em;
    padding-right: .2em;
    font-weight: normal;
    font-style: normal;
    color: DarkGreen; /* Green, DarkGreen */
    /* background-color: #f4f4f9; */
    border: 1px dashed #2f6fab;
    /* padding is a Lucida Console issue */
    padding-top: .2em;
    padding-bottom: .1em;
}
table var {
   border: none;
}
small {
    font-size: 83%;
}

/*
** the main content area
*/

#siteSub {
   display: none;
}
#jump-to-nav {
   display: none;
}

#contentSub, #contentSub2 {
   font-size: 84%;
   line-height: 1.2em;
   margin: 0 0 1.4em 1em;
   color: #7d7d7d;
   width: auto;
}
span.subpages {
   display: block;
}

/* Some space under the headers in the content area */
#bodyContent h1, #bodyContent h2 {
   margin-bottom: .6em;
}
#bodyContent h3, #bodyContent h4, #bodyContent h5 {
   margin-bottom: .3em;
}
#firstHeading {
   margin-bottom: .1em;
   /* These two rules hack around bug 2013 (fix for more limited bug 11325).
      When bug 2013 is fixed properly, they should be removed. */
   line-height: 1.2em;
   padding-bottom: 0;
}

/* user notification thing */
.usermessage {
   background-color: #ffce7b;
   border: 1px solid #ffa500;
   color: black;
   font-weight: bold;
   margin: 2em 0 1em;
   padding: .5em 1em;
   vertical-align: middle;
}
#siteNotice {
   text-align: center;
   font-size: 95%;
   padding: 0 .9em;
}
#siteNotice p {
   margin: 0;
   padding: 0;
}
.success {
   color: green;
   font-size: larger;
}
.error {
   color: red;
   font-size: larger;
}
.errorbox, .successbox {
   font-size: larger;
   border: 2px solid;
   padding: .5em 1em;
   float: left;
   margin-bottom: 2em;
   color: #000;
}
.errorbox {
   border-color: red;
   background-color: #fff2f2;
}
.successbox {
   border-color: green;
   background-color: #dfd;
}
.errorbox h2, .successbox h2 {
   font-size: 1em;
   font-weight: bold;
   display: inline;
   margin: 0 .5em 0 0;
   border: none;
}

.catlinks {
   border: 1px solid #aaa;
   background-color: #f9f9f9;
   padding: 5px;
   margin-top: 1em;
   clear: both;
}
/* currently unused, intended to be used by a metadata box
in the bottom-right corner of the content area */
.documentDescription {
   /* The summary text describing the document */
   font-weight: bold;
   display: block;
   margin: 1em 0;
   line-height: 1.5em;
}
.documentByLine {
   text-align: right;
   font-size: 90%;
   clear: both;
   font-weight: normal;
   color: #76797c;
}

/* emulate center */
.center {
   width: 100%;
   text-align: center;
}
*.center * {
   margin-left: auto;
   margin-right: auto;
}
/* small for tables and similar */
.small, .small * {
   font-size: 94%;
}
table.small {
   font-size: 100%;
}

/*
** content styles
*/

/* k3 change

#toc,
.toc,
.mw-warning {
   border: 1px solid #aaa;
   background-color: #f9f9f9;
   padding: 5px;
   font-size: 95%;
}
#toc h2,
.toc h2 {
   display: inline;
   border: none;
   padding: 0;
   font-size: 100%;
   font-weight: bold;
}
#toc #toctitle,
.toc #toctitle,
#toc .toctitle,
.toc .toctitle {
   text-align: center;
}
#toc ul,
.toc ul {
   list-style-type: none;
   list-style-image: none;
   margin-left: 0;
   padding-left: 0;
   text-align: left;
}
#toc ul ul,
.toc ul ul {
   margin: 0 0 0 2em;
}
#toc .toctoggle,
.toc .toctoggle {
   font-size: 94%;
}

*/

/* begin change k3 */

#toc,
.toc,
.mw-warning {
   line-height: 1em;
   border: 1px solid #aaa;
   background-color: #f4f4f9;
   padding: 5px;
   font-size: 95%;
}
#toc h2,
.toc h2 {
   display: inline;
   border: none;
   padding: 0;
   font-size: 120%;
   font-weight: bold;
}
#toc #toctitle,
.toc #toctitle,
#toc .toctitle,
.toc .toctitle {
   text-align: center;
}
#toc ul,
.toc ul {
   line-height: .7em;
   list-style-type: none;
   list-style-image: none;
   margin-top: .5em;
   margin-bottom: 0em;
   margin-left: 0;
   padding-left: 0;
   text-align: left;
}
#toc ul ul,
.toc ul ul {
   margin: 0 0 0 2em;
}
#toc .toctoggle,
.toc .toctoggle {
   font-size: 100%;
}

/* end change k3 */

.mw-warning {
   margin-left: 50px;
   margin-right: 50px;
   text-align: center;
}

/* images */
div.floatright, table.floatright {
   clear: right;
   float: right;
   position: relative;
   margin: 0 0 .5em .5em;
   border: 0;
/*
   border: .5em solid white;
   border-width: .5em 0 .8em 1.4em;
*/
}
div.floatright p { font-style: italic; }
div.floatleft, table.floatleft {
   float: left;
   clear: left;
   position: relative;
   margin: 0 .5em .5em 0;
   border: 0;
/*
   margin: .3em .5em .5em 0;
   border: .5em solid white;
   border-width: .5em 1.4em .8em 0;
*/
}
div.floatleft p { font-style: italic; }
/* thumbnails */
div.thumb {
   margin-bottom: .5em;
   border-style: solid;
   border-color: white;
   width: auto;
}
div.thumbinner {
   border: 1px solid #ccc;
   padding: 3px !important;
   background-color: #f9f9f9;
   font-size: 94%;
   text-align: center;
   overflow: hidden;
}
html .thumbimage {
   border: 1px solid #ccc;
}
html .thumbcaption {
   border: none;
   text-align: left;
   line-height: 1.4em;
   padding: 3px !important;
   font-size: 94%;
}
div.magnify {
   float: right;
   border: none !important;
   background: none !important;
}
div.magnify a, div.magnify img {
   display: block;
   border: none !important;
   background: none !important;
}
div.tright {
   clear: right;
   float: right;
   border-width: .5em 0 .8em 1.4em;
}
div.tleft {
   float: left;
   clear: left;
   margin-right: .5em;
   border-width: .5em 1.4em .8em 0;
}
img.thumbborder {
   border: 1px solid #dddddd;
}
.hiddenStructure {
   display: none;
}

/*
** classes for special content elements like town boxes
** intended to be referenced directly from the wiki src
*/

/*
** User styles
*/
/* table standards */
table.rimage {
   float: right;
   position: relative;
   margin-left: 1em;
   margin-bottom: 1em;
   text-align: center;
}
.toccolours {
   border: 1px solid #aaa;
   background-color: #f9f9f9;
   padding: 5px;
   font-size: 95%;
}

/*
** edit views etc
*/
.special li {
   line-height: 1.4em;
   margin: 0;
   padding: 0;
}

/*
** keep the whitespace in front of the ^=, hides rule from konqueror
** this is css3, the validator doesn't like it when validating as css2
*/
#bodyContent a.external,
#bodyContent a[href ^="gopher://"] {
   background: url(external.png) center right no-repeat;
   padding: 0 13px;
}
.rtl #bodyContent a.external,
.rtl #bodyContent a[href ^="gopher://"] {
   background-image: url(external-rtl.png);
}
#bodyContent a[href ^="https://"],
.link-https {
   background: url(lock_icon.gif) center right no-repeat;
   padding: 0 16px;
}
#bodyContent a[href ^="mailto:"],
.link-mailto {
   background: url(mail_icon.gif) center right no-repeat;
   padding: 0 18px;
}
#bodyContent a[href ^="news://"] {
   background: url(news_icon.png) center right no-repeat;
   padding: 0 18px;
}
#bodyContent a[href ^="ftp://"],
.link-ftp {
   background: url(file_icon.gif) center right no-repeat;
   padding: 0 18px;
}
#bodyContent a[href ^="irc://"],
#bodyContent a.extiw[href ^="irc://"],
.link-irc {
   background: url(discussionitem_icon.gif) center right no-repeat;
   padding: 0 18px;
}
#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"],
#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"],
#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
.link-audio {
   background: url("audio.png") center right no-repeat;
   padding: 0 13px;
}
#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
.link-video {
   background: url("video.png") center right no-repeat;
   padding: 0 13px;
}
#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
.link-document {
   background: url("document.png") center right no-repeat;
   padding: 0 12px;
}

/* for rtl wikis */
.rtl #bodyContent a.external {
   background-position: left;
   padding-right: 0;
}
.rtl a.feedlink {
   background-position: right;
   padding-right: 16px;
   padding-left: 0;
}

/* correction for ltr wikis */
.ltr #bodyContent a.external {
   padding-left: 0;
}

/* disable interwiki styling */
#bodyContent a.extiw,
#bodyContent a.extiw:active {
   color: #36b;
   background: none;
   padding: 0;
}
#bodyContent a.external {
   color: #36b;
}
/* this can be used in the content area to switch off
special external link styling */
#bodyContent .plainlinks a {
   background: none !important;
   padding: 0 !important;
}
/*
** Structural Elements
*/

/*
** general portlet styles (elements in the quickbar)
*/
.portlet {
   border: none;
   /* -top -right -bottom -left */
   margin: 0 0 0 .5em; /* k3 was 0 0 .5em */
   padding: 0;
   float: none;
   width: 11.6em;
   overflow: hidden;
}
.portlet h4 {
   font-size: 100%; /* k3 was 95% */
   font-weight: normal;
   white-space: nowrap;
}
.portlet h5 {
   background: transparent;
   padding: 0 1em 0 .5em;
   display: inline;
   height: 1em;
   text-transform: lowercase;
   font-size: 100%; /* k3 was 91% */
   font-weight: normal;
   white-space: nowrap;
}
.portlet h6 {
   background: #ffae2e;
   border: 1px solid #2f6fab;
   border-style: solid solid none solid;
   padding: 0 1em 0 1em;
   text-transform: lowercase;
   display: block;
   font-size: 1em;
   height: 1.2em;
   font-weight: normal;
   white-space: nowrap;
}
.pBody {
   font-size: 100%; /* k3 was 95% */
   background-color: white;
   color: black;
   border-collapse: collapse;
   border: 1px solid #2f6fab; /* k3 was #aaa; */
   /* -top -right -bottom -left */
   margin: 0.0em 0.0em 0.0em 0.0em; /* new k3 */
   /* was k3 padding: 0 .8em .3em .5em; */
   padding: .0em .0em .0em .0em;
}
.portlet h1,
.portlet h2,
.portlet h3,
.portlet h4 {
   margin: 0;
   padding: 0;
}
.portlet ul {
   /* -top -right -bottom -left */
   margin: .5em 0 .5em 2em; /* new k3 */
   line-height: 1.5em;
   list-style-type: square;
   list-style-image: url(bullet.gif);
   font-size: 95%; /* k3 was 95%; */
}
.portlet li {
   padding: 0;
   margin: 0;
}

/*
** Logo properties
*/

#p-logo {
   top: 0;
   left: 0;
   position: absolute; /*needed to use z-index */
   z-index: 3;
   height: 155px;
   width: 12em;
   overflow: visible;
}
#p-logo h5 {
   display: none;
}
#p-logo a,
#p-logo a:hover {
   display: block;
   height: 155px;
   width: 12.2em;
   background-repeat: no-repeat;
   background-position: 35% 50% !important;
   text-decoration: none;
}

/*
** Search portlet
*/
#p-search {
   position: relative;
   z-index: 3;
}
input.searchButton {
   margin-top: 1px;
   font-size: 95%;
}
#searchGoButton {
   padding-left: .5em;
   padding-right: .5em;
   font-weight: bold;
}
#searchInput {
   width: 10.9em;
   margin: 0;
   font-size: 95%;
}
#p-search .pBody {
   padding: .5em .4em .4em .4em;
   text-align: center;
}
#p-search #searchform div div {
   margin-top: .4em;
   font-size: 95%;
}
/*
** the personal toolbar
*/
#p-personal {
   position: absolute;
   left: 0;
   top: 0;
   z-index: 0;
}
#p-personal {
   width: 100%;
   white-space: nowrap;
   padding: 0;
   margin: 0;
   border: none;
   background: none;
   overflow: visible;
   line-height: 1.2em;
}
#p-personal h5 {
   display: none;
}
#p-personal .portlet,
#p-personal .pBody {
   z-index: 0;
   padding: 0;
   margin: 0;
   border: none;
   overflow: visible;
   background: none;
}
/* this is the ul contained in the portlet */
#p-personal ul {
   border: none;
   line-height: 1.4em;
   color: #2f6fab;
   padding: 0 2em 0 3em;
   margin: 0;
   text-align: right;
   list-style: none;
   z-index: 0;
   background: none;
   cursor: default;
}
#p-personal li {
   z-index: 0;
   border: none;
   padding: 0;
   display: inline;
   color: #2f6fab;
   margin-left: 1em;
   line-height: 1.2em;
   background: none;
}
#p-personal li a {
   text-decoration: none;
   color: #005896;
   padding-bottom: .2em;
   background: none;
}
#p-personal li a:hover {
   background-color: white;
   padding-bottom: .2em;
   text-decoration: none;
}
#p-personal li.active a:hover {
   background-color: transparent;
}
/* the icon in front of the user name, single quotes
in bg url to hide it from iemac */
li#pt-userpage,
li#pt-anonuserpage,
li#pt-login {
   background: url(user.gif) top left no-repeat;
   padding-left: 20px;
   text-transform: none;
}
#p-personal ul {
   text-transform: lowercase;
}
#p-personal li.active {
   font-weight: bold;
}
/*
** the page-related actions- page/talk, edit etc
*/
#p-cactions {
   position: absolute;
   top: 1.3em;
   left: 11.5em;
   margin: 0;
   white-space: nowrap;
   width: 76%;
   line-height: 1.1em;
   overflow: visible;
   background: none;
   border-collapse: collapse;
   padding-left: 1em;
   list-style: none;
   font-size: 95%;
}
#p-cactions ul {
   list-style: none;
}
#p-cactions li {
   display: inline;
   border: 1px solid #aaa;
   border-bottom: none;
   padding: 0 0 .1em 0;
   margin: 0 .3em 0 0;
   overflow: visible;
   background: white;
}
#p-cactions li.selected {
   border-color: #fabd23;
   padding: 0 0 .2em 0;
   font-weight: bold;
}
#p-cactions li a {
   background-color: #fbfbfb;
   color: #002bb8;
   border: none;
   padding: 0 .8em .3em;
   position: relative;
   z-index: 0;
   margin: 0;
   text-decoration: none;
}
#p-cactions li.selected a {
   z-index: 3;
   padding: 0 1em .2em!important;
   background-color: white;
}
#p-cactions .new a {
   color: #ba0000;
}
#p-cactions li a:hover {
   z-index: 3;
   text-decoration: none;
   background-color: white;
}
#p-cactions h5 {
   display: none;
}
#p-cactions li.istalk {
   margin-right: 0;
}
#p-cactions li.istalk a {
   padding-right: .5em;
}
#p-cactions #ca-addsection a {
   padding-left: .4em;
   padding-right: .4em;
}
/* offsets to distinguish the tab groups */
li#ca-talk {
   margin-right: 1.6em;
}
li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
   margin-left: 1.6em;
}
#p-cactions .pBody {
   font-size: 1em;
   background-color: transparent;
   color: inherit;
   border-collapse: inherit;
   border: 0;
   padding: 0;
}
#p-cactions .hiddenStructure {
   display: none;
}
#p-cactions li a {
   text-transform: lowercase;
}

#p-lang {
   position: relative;
   z-index: 3;
}

/* TODO: #t-iscite is only used by the Cite extension, come up with some
 * system which allows extensions to add to this file on the fly
 */
#t-ispermalink, #t-iscite {
   color: #999;
}
/*
** footer
*/
#footer {
   background-color: white;
   border-top: 1px solid #fabd23;
   border-bottom: 1px solid #fabd23;
   margin: .6em 0 1em 0;
   padding: .4em 0 1.2em 0;
   text-align: center;
   font-size: 90%;
}
#footer li {
   display: inline;
   margin: 0 1.3em;
}
#f-poweredbyico, #f-copyrightico {
   margin: 0 8px;
   position: relative;
   top: -2px; /* Bump it up just a tad */
}
#f-poweredbyico {
   float: right;
   height: 1%;
}
#f-copyrightico {
   float: left;
   height: 1%;
}

/* js pref toc */
#preftoc {
   margin: 0;
   padding: 0;
   width: 100%;
   clear: both;
}
#preftoc li {
   background-color: #f0f0f0;
   color: #000;
}
#preftoc li {
   margin: 1px -2px 1px 2px;
   float: left;
   padding: 2px 0 3px 0;
   border: 1px solid #fff;
   border-right-color: #716f64;
   border-bottom: 0;
   position: relative;
   white-space: nowrap;
   list-style-type: none;
   list-style-image: none;
   z-index: 3;
}
#preftoc li.selected {
   font-weight: bold;
   background-color: #f9f9f9;
   border: 1px solid #aaa;
   border-bottom: none;
   cursor: default;
   top: 1px;
   padding-top: 2px;
   margin-right: -3px;
}
#preftoc > li.selected {
   top: 2px;
}
#preftoc a,
#preftoc a:active {
   display: block;
   color: #000;
   padding: 0 .7em;
   position: relative;
   text-decoration: none;
}
#preftoc li.selected a {
   cursor: default;
   text-decoration: none;
}
#prefcontrol {
   padding-top: 2em;
   clear: both;
}
#preferences {
   margin: 0;
   border: 1px solid #aaa;
   clear: both;
   padding: 1.5em;
   background-color: #F9F9F9;
}
.prefsection {
   border: none;
   padding: 0;
   margin: 0;
}
.prefsection fieldset {
   border: 1px solid #aaa;
   float: left;
   margin-right: 2em;
}
.prefsection legend {
   font-weight: bold;
}
.prefsection table, .prefsection legend {
   background-color: #F9F9F9;
}
.mainLegend {
   display: none;
}
div.prefsectiontip {
   font-size: x-small;
   padding: .2em 2em;
   color: #666;
}
.btnSavePrefs {
   font-weight: bold;
   padding-left: .3em;
   padding-right: .3em;
}

.preferences-login {
   clear: both;
   margin-bottom: 1.5em;
}

.prefcache {
   font-size: 90%;
   margin-top: 2em;
}

div#userloginForm form,
div#userlogin form#userlogin2 {
   margin: 0 3em 1em 0;
   border: 1px solid #aaa;
   clear: both;
   padding: 1.5em 2em;
   background-color: #f9f9f9;
   float: left;
}
.rtl div#userloginForm form,
.rtl div#userlogin form#userlogin2 {
   float: right;
}

div#userloginForm table,
div#userlogin form#userlogin2 table {
   background-color: #f9f9f9;
}

div#userloginForm h2,
div#userlogin form#userlogin2 h2 {
   padding-top: 0;
}

div#userlogin .captcha,
div#userloginForm .captcha {
   border: 1px solid #bbb;
   padding: 1.5em 2em;
   background-color: white;
}

#loginend, #signupend {
   clear: both;
}

#userloginprompt, #languagelinks {
   font-size: 85%;
}

#login-sectiontip {
   font-size: 85%;
   line-height: 1.2;
   padding-top: 2em;
}

#userlogin .loginText, #userlogin .loginPassword {
   width: 12em;
}

#userloginlink a, #wpLoginattempt, #wpCreateaccount {
   font-weight: bold;
}

/*
** IE/Mac fixes, hope to find a validating way to move this
** to a separate stylesheet. This would work but doesn't validate:
** @import("IEMacFixes.css");
*/
/* tabs: border on the a, not the div */
* > html #p-cactions li { border: none; }
* > html #p-cactions li a {
   border: 1px solid #aaa;
   border-bottom: none;
}
* > html #p-cactions li.selected a { border-color: #fabd23; }
/* footer icons need a fixed width */
* > html #f-poweredbyico,
* > html #f-copyrightico { width: 88px; }
* > html #bodyContent,
* > html #bodyContent pre {
   overflow-x: auto;
   width: 100%;
   padding-bottom: 25px;
}

/* more IE fixes */
/* float/negative margin brokenness */
* html #footer {margin-top: 0;}
* html #column-content {
   display: inline;
   margin-bottom: 0;
}
* html div.editsection { font-size: smaller; }
#pagehistory li.selected { position: relative; }

/* Mac IE 5.0 fix; floated content turns invisible */
* > html #column-content {
   float: none;
}
* > html #column-one {
   position: absolute;
   left: 0;
   top: 0;
}
* > html #footer {
   margin-left: 13.2em;
}
.redirectText {
   font-size: 150%;
   margin: 5px;
}

.printfooter {
   display: none;
}

.not-patrolled {
   background-color: #ffa;
}
div.patrollink {
   clear: both;
   font-size: 75%;
   text-align: right;
}
span.newpage, span.minor, span.bot {
   font-weight: bold;
}
span.unpatrolled {
   font-weight: bold;
   color: red;
}

.sharedUploadNotice {
   font-style: italic;
}

span.updatedmarker {
   color: black;
   background-color: #0f0;
}

table.gallery {
   border: 1px solid #ccc;
   margin: 2px;
   padding: 2px;
   background-color: white;
}

table.gallery tr {
   vertical-align: top;
}

table.gallery td {
   vertical-align: top;
   background-color: #f9f9f9;
   border: solid 2px white;
}
/* Keep this temporarily so that cached pages will display right */
table.gallery td.galleryheader {
    text-align: center;
   font-weight: bold;
}
table.gallery caption {
   font-weight: bold;
}

div.gallerybox {
   margin: 2px;
}

div.gallerybox div.thumb {
   text-align: center;
   border: 1px solid #ccc;
   margin: 2px;
}

div.gallerytext {
   overflow: hidden;
   font-size: 94%;
   padding: 2px 4px;
}

span.comment {
   font-style: italic;
}

span.changedby {
   font-size: 95%;
}

.previewnote {
   text-indent: 3em;
   color: #c00;
   border-bottom: 1px solid #aaa;
   padding-bottom: 1em;
   margin-bottom: 1em;
}

.previewnote p {
   margin: 0;
   padding: 0;
}

.editExternally {
   border: 1px solid gray;
   background-color: #ffffff;
   padding: 3px;
   margin-top: 0.5em;
   float: left;
   font-size: small;
   text-align: center;
}
.editExternallyHelp {
   font-style: italic;
   color: gray;
}

.toggle {
   margin-left: 2em;
   text-indent: -2em;
}

/* Classes for EXIF data display */
table.mw_metadata {
   font-size: 0.8em;
   margin-left: 0.5em;
   margin-bottom: 0.5em;
   width: 300px;
}

table.mw_metadata caption {
   font-weight: bold;
}

table.mw_metadata th {
   font-weight: normal;
}

table.mw_metadata td {
   padding: 0.1em;
}

table.mw_metadata {
   border: none;
   border-collapse: collapse;
}

table.mw_metadata td, table.mw_metadata th {
   text-align: center;
   border: 1px solid #aaaaaa;
   padding-left: 0.1em;
   padding-right: 0.1em;
}

table.mw_metadata th {
   background-color: #f9f9f9;
}

table.mw_metadata td {
   background-color: #fcfcfc;
}

table.collapsed tr.collapsable {
   display: none;
}


/* filetoc */
ul#filetoc {
   text-align: center;
   border: 1px solid #aaaaaa;
   background-color: #f9f9f9;
   padding: 5px;
   font-size: 95%;
   margin-bottom: 0.5em;
   margin-left: 0;
   margin-right: 0;
}

#filetoc li {
   display: inline;
   list-style-type: none;
   padding-right: 2em;
}

input#wpSummary {
   width: 80%;
}

/* @bug 1714 */
input#wpSave, input#wpDiff {
   margin-right: 0.33em;
}

#wpSave {
   font-weight: bold;
}

/* Classes for article validation */

table.revisionform_default {
   border: 1px solid #000000;
}

table.revisionform_focus {
   border: 1px solid #000000;
   background-color:#00BBFF;
}

tr.revision_tr_default {
   background-color:#EEEEEE;
}

tr.revision_tr_first {
   background-color:#DDDDDD;
}

p.revision_saved {
   color: green;
   font-weight:bold;
}

#mw_trackbacks {
   border: solid 1px #bbbbff;
   background-color: #eeeeff;
   padding: 0.2em;
}


/* Allmessages table */

#allmessagestable th {
   background-color: #b2b2ff;
}

#allmessagestable tr.orig {
   background-color: #ffe2e2;
}

#allmessagestable tr.new {
   background-color: #e2ffe2;
}

#allmessagestable tr.def {
   background-color: #f0f0ff;
}


/* noarticletext */
div.noarticletext {
   border: 1px solid #ccc;
   background: #fff;
   padding: .2em 1em;
   color: #000;
}

div#searchTargetContainer {
   left:       10px;
   top:        10px;
   width:      90%;
   background: white;
}

div#searchTarget {
   padding:    3px;
   margin:     5px;
   background: #F0F0F0;
   border:     solid 1px blue;
}

div#searchTarget ul li {
   list-style: none;
}

div#searchTarget ul li:before {
   color: orange;
   content: "\00BB \0020";
}

div#searchTargetHide {
   float:right;
   border:solid 1px black;
   background:#DCDCDC;
   padding:2px;
}

#powersearch p {
   margin-top:0px;
}

div.multipageimagenavbox {
   border: solid 1px silver;
   padding: 4px;
   margin: 1em;
   background: #f0f0f0;
}

div.multipageimagenavbox div.thumb {
   border: none;
   margin-left: 2em;
   margin-right: 2em;
}

div.multipageimagenavbox hr {
   margin: 6px;
}

table.multipageimage td {
   text-align: center;
}

/** Special:Version */

table#sv-ext, table#sv-hooks, table#sv-software {
   margin: 1em;
   padding:0em;
}

#sv-ext td, #sv-hooks td, #sv-software td,
#sv-ext th, #sv-hooks th, #sv-software th {
   border: 1px solid #A0A0A0;
   padding: 0 0.15em 0 0.15em;
}
#sv-ext th, #sv-hooks th, #sv-software th {
   background-color: #F0F0F0;
   color: black;
   padding: 0 0.15em 0 0.15em;
}
tr.sv-space{
   height: 0.8em;
   border:none;
}
tr.sv-space td { display: none; }

/*
  Table pager (e.g. Special:Imagelist)
  - remove underlines from the navigation link
  - collapse borders
  - set the borders to outsets (similar to Special:Allmessages)
  - remove line wrapping for all td and th, set background color
  - restore line wrapping for the last two table cells (description and size)
*/
.TablePager { min-width: 80%; }
.TablePager_nav a { text-decoration: none; }
.TablePager { border-collapse: collapse; }
.TablePager, .TablePager td, .TablePager th {
   border: 1px solid #aaaaaa;
   padding: 0 0.15em 0 0.15em;
}
.TablePager th { background-color: #eeeeff }
.TablePager td { background-color: #ffffff }
.TablePager tr:hover td { background-color: #eeeeff }

.imagelist td, .imagelist th { white-space: nowrap }
.imagelist .TablePager_col_links { background-color: #eeeeff }
.imagelist .TablePager_col_img_description { white-space: normal }
.imagelist th.TablePager_sort { background-color: #ccccff }

.templatesUsed { margin-top: 1.5em; }

.mw-summary-preview {
   margin: 0.1em 0;
}

/* Friendlier slave lag warnings */
div.mw-lag-warn-normal,
div.mw-lag-warn-high {
   padding: 3px;
   text-align: center;
   margin: 3px auto;
}
div.mw-lag-warn-normal {
   border: 1px solid #FFCC66;
   background-color: #FFFFCC;
}
div.mw-lag-warn-high {
   font-weight: bold;
   border: 2px solid #FF0033;
   background-color: #FFCCCC;
}

.MediaTransformError {
   background-color: #ccc;
   padding: 0.1em;
}
.MediaTransformError td {
   text-align: center;
   vertical-align: middle;
   font-size: 90%;
}

/** Special:Search stuff */
div#mw-search-interwiki-caption {
   text-align: center;
   font-weight: bold;
   font-size: 95%;
}

.mw-search-interwiki-project {
   font-size: 97%;
   text-align: left;
   padding-left: 0.2em;
   padding-right: 0.15em;
   padding-bottom: 0.2em;
   padding-top: 0.15em;
   background: #cae8ff;
}

/* God-damned hack for the crappy layout */
.os-suggest {
   font-size: 127%;
}

Letter Spacing Groups

iiiiiiiiii
jjjjjjjjjj
llllllllll

ffffffffff
IIIIIIIIII

rrrrrrrrrr

tttttttttt (depends: f or r)

vvvvvvvvvv (depends:c or alone)

cccccccccc (depends:T or alone with v)
kkkkkkkkkk (depends:T or alone with v)
ssssssssss (depends:T or alone with v)
xxxxxxxxxx (depends:T or alone with v)
yyyyyyyyyy (depends:T or alone with v)
zzzzzzzzzz (depends:T or alone with v)

JJJJJJJJJJ

LLLLLLLLLL
0000000000
5555555555
9999999999
aaaaaaaaaa
bbbbbbbbbb
dddddddddd
eeeeeeeeee
gggggggggg
hhhhhhhhhh
nnnnnnnnnn
oooooooooo
pppppppppp
qqqqqqqqqq
uuuuuuuuuu

TTTTTTTTTT
ZZZZZZZZZZ

FFFFFFFFFF (depends; T or alone)

KKKKKKKKKK

AAAAAAAAAA
BBBBBBBBBB
EEEEEEEEEE
PPPPPPPPPP
SSSSSSSSSS
VVVVVVVVVV
YYYYYYYYYY

XXXXXXXXXX (depends: A or L)

CCCCCCCCCC
DDDDDDDDDD
HHHHHHHHHH
NNNNNNNNNN
RRRRRRRRRR
UUUUUUUUUU
wwwwwwwwww

GGGGGGGGGG
OOOOOOOOOO
QQQQQQQQQQ

MMMMMMMMMM
mmmmmmmmmm

WWWWWWWWWW

Header Level 0 (=)

This is level Header Level 0 (Page Title Header).

Header Level 1 (==)

This is level Header Level 1.

Header Level 2 (===)

This is level Header Level 2.

Header Level 3 (====)

This is level Header Level 3.

Header Level 4 (=====)

This is level Header Level 4.

Header Level 5 (======)

This is the deepest header level supported in MediaWiki.

Views
Personal tools