--- /dev/null
+<?php
+// This file exists to ensure that base classes are preloaded before
+// MonoBook.php is compiled, working around a bug in the APC opcode
+// cache on PHP 5, where cached code can break if the include order
+// changed on a subsequent page view.
+// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
+
+if ( ! defined( 'MEDIAWIKI' ) )
+ die( 1 );
+
+require_once( dirname( dirname( __FILE__ ) ) . '/includes/SkinTemplate.php');
--- /dev/null
+<?php
+/**
+ * Planteome - Branch of Vector customized to the Planteome Annotation Wiki.
+ *
+ * @todo document
+ * @file
+ * @ingroup Skins
+ * @version 0.0.1
+ * @author Justin Preece (preecej@science.oregonstate.edu)
+ * @license CC BY-NC-SA 3.0
+
+ */
+
+if( !defined( 'MEDIAWIKI' ) )
+ die( -1 );
+
+/**
+ * SkinTemplate class for Planteome skin
+ * @ingroup Skins
+ */
+class SkinPlanteome extends SkinTemplate {
+
+ /* Functions */
+ var $skinname = 'planteome', $stylename = 'planteome',
+ $template = 'PlanteomeTemplate', $useHeadElement = true;
+
+ /**
+ * Initializes output page and sets up skin-specific parameters
+ * @param object $out Output page object to initialize
+ */
+ public function initPage( OutputPage $out ) {
+ global $wgStylePath, $wgJsMimeType, $wgStyleVersion, $wgScriptPath, $wgPlanteomeExtraStyles;
+
+ parent::initPage( $out );
+
+ // Append skin-specific styles
+ $out->addStyle( 'planteome/main-rtl.css', 'screen', '', 'rtl' );
+ $out->addStyle( 'planteome/main-ltr.css', 'screen', '', 'ltr' );
+ // Append CSS which includes IE only behavior fixes for hover support -
+ // this is better than including this in a CSS fille since it doesn't
+ // wait for the CSS file to load before fetching the HTC file.
+ $out->addScript(
+ '<!--[if lt IE 7]><style type="text/css">body{behavior:url("' .
+ $wgStylePath .
+ '/planteome/csshover.htc")}</style><![endif]-->'
+ );
+ // Add extra stylesheets
+ // THIS IS ONLY USEFUL FOR EXPERIMENTING WITH DIFFERNT STYLE OPTIONS! THIS WILL BE REMOVED IN THE NEAR FUTURE.
+ if ( is_array( $wgPlanteomeExtraStyles ) ) {
+ foreach ( $wgPlanteomeExtraStyles as $style ) {
+ $out->addStyle( 'planteome/' . $style, 'screen' );
+ }
+ }
+ }
+ /**
+ * Builds a structured array of links used for tabs and menus
+ * @return array
+ * @private
+ */
+ function buildNavigationUrls() {
+ global $wgContLang, $wgLang, $wgOut, $wgUser, $wgRequest, $wgArticle, $wgStylePath;
+ global $wgDisableLangConversion, $wgPlanteomeUseIconWatch;
+
+ wfProfileIn( __METHOD__ );
+
+ $links = array(
+ 'namespaces' => array(),
+ 'views' => array(),
+ 'actions' => array(),
+ 'variants' => array()
+ );
+
+ // Detects parameters
+ $action = $wgRequest->getVal( 'action', 'view' );
+ $section = $wgRequest->getVal( 'section' );
+
+ // Checks if page is some kind of content
+ if( $this->iscontent ) {
+
+ // Gets page objects for the related namespaces
+ $subjectPage = $this->mTitle->getSubjectPage();
+ $talkPage = $this->mTitle->getTalkPage();
+
+ // Determines if this is a talk page
+ $isTalk = $this->mTitle->isTalkPage();
+
+ // Generates XML IDs from namespace names
+ $subjectId = $this->mTitle->getNamespaceKey( '' );
+
+ if ( $subjectId == 'main' ) {
+ $talkId = 'talk';
+ } else {
+ $talkId = "{$subjectId}_talk";
+ }
+ $currentId = $isTalk ? $talkId : $subjectId;
+
+ // Adds namespace links
+ $links['namespaces'][$subjectId] = $this->tabAction(
+ $subjectPage, 'vector-namespace-' . $subjectId, !$isTalk, '', true
+ );
+ $links['namespaces'][$subjectId]['context'] = 'subject';
+ $links['namespaces'][$talkId] = $this->tabAction(
+ $talkPage, 'vector-namespace-talk', $isTalk, '', true
+ );
+ $links['namespaces'][$talkId]['context'] = 'talk';
+
+ // Adds view view link
+ if ( $this->mTitle->exists() ) {
+ $links['views']['view'] = $this->tabAction(
+ $isTalk ? $talkPage : $subjectPage,
+ 'vector-view-view', ( $action == 'view' ), '', true
+ );
+ }
+
+ wfProfileIn( __METHOD__ . '-edit' );
+
+ // Checks if user can...
+ if (
+ // edit the current page
+ $this->mTitle->quickUserCan( 'edit' ) &&
+ (
+ // if it exists
+ $this->mTitle->exists() ||
+ // or they can create one here
+ $this->mTitle->quickUserCan( 'create' )
+ )
+ ) {
+ // Builds CSS class for talk page links
+ $isTalkClass = $isTalk ? ' istalk' : '';
+
+ // Determines if we're in edit mode
+ $selected = (
+ ( $action == 'edit' || $action == 'submit' ) &&
+ ( $section != 'new' )
+ );
+ $links['views']['edit'] = array(
+ 'class' => ( $selected ? 'selected' : '' ) . $isTalkClass,
+ 'text' => $this->mTitle->exists()
+ ? wfMsg( 'vector-view-edit' )
+ : wfMsg( 'vector-view-create' ),
+ 'href' =>
+ $this->mTitle->getLocalUrl( $this->editUrlOptions() )
+ );
+ // Checks if this is a current rev of talk page and we should show a new
+ // section link
+ if ( ( $isTalk && $wgArticle->isCurrent() ) || ( $wgOut->showNewSectionLink() ) ) {
+ // Checks if we should ever show a new section link
+ if ( !$wgOut->forceHideNewSectionLink() ) {
+ // Adds new section link
+ //$links['actions']['addsection']
+ $links['views']['addsection'] = array(
+ 'class' => 'collapsible ' . ( $section == 'new' ? 'selected' : false ),
+ 'text' => wfMsg( 'vector-action-addsection' ),
+ 'href' => $this->mTitle->getLocalUrl(
+ 'action=edit§ion=new'
+ )
+ );
+ }
+ }
+ // Checks if the page is known (some kind of viewable content)
+ } elseif ( $this->mTitle->isKnown() ) {
+ // Adds view source view link
+ $links['views']['viewsource'] = array(
+ 'class' => ( $action == 'edit' ) ? 'selected' : false,
+ 'text' => wfMsg( 'vector-view-viewsource' ),
+ 'href' =>
+ $this->mTitle->getLocalUrl( $this->editUrlOptions() )
+ );
+ }
+ wfProfileOut( __METHOD__ . '-edit' );
+
+ wfProfileIn( __METHOD__ . '-live' );
+
+ // Checks if the page exists
+ if ( $this->mTitle->exists() ) {
+ // Adds history view link
+ $links['views']['history'] = array(
+ 'class' => 'collapsible ' . ( ($action == 'history') ? 'selected' : false ),
+ 'text' => wfMsg( 'vector-view-history' ),
+ 'href' => $this->mTitle->getLocalUrl( 'action=history' ),
+ 'rel' => 'archives',
+ );
+
+ if( $wgUser->isAllowed( 'delete' ) ) {
+ $links['actions']['delete'] = array(
+ 'class' => ($action == 'delete') ? 'selected' : false,
+ 'text' => wfMsg( 'vector-action-delete' ),
+ 'href' => $this->mTitle->getLocalUrl( 'action=delete' )
+ );
+ }
+ if ( $this->mTitle->quickUserCan( 'move' ) ) {
+ $moveTitle = SpecialPage::getTitleFor(
+ 'Movepage', $this->thispage
+ );
+ $links['actions']['move'] = array(
+ 'class' => $this->mTitle->isSpecial( 'Movepage' ) ?
+ 'selected' : false,
+ 'text' => wfMsg( 'vector-action-move' ),
+ 'href' => $moveTitle->getLocalUrl()
+ );
+ }
+
+ if (
+ $this->mTitle->getNamespace() !== NS_MEDIAWIKI &&
+ $wgUser->isAllowed( 'protect' )
+ ) {
+ if ( !$this->mTitle->isProtected() ){
+ $links['actions']['protect'] = array(
+ 'class' => ($action == 'protect') ?
+ 'selected' : false,
+ 'text' => wfMsg( 'vector-action-protect' ),
+ 'href' =>
+ $this->mTitle->getLocalUrl( 'action=protect' )
+ );
+
+ } else {
+ $links['actions']['unprotect'] = array(
+ 'class' => ($action == 'unprotect') ?
+ 'selected' : false,
+ 'text' => wfMsg( 'vector-action-unprotect' ),
+ 'href' =>
+ $this->mTitle->getLocalUrl( 'action=unprotect' )
+ );
+ }
+ }
+ } else {
+ // article doesn't exist or is deleted
+ if (
+ $wgUser->isAllowed( 'deletedhistory' ) &&
+ $wgUser->isAllowed( 'undelete' )
+ ) {
+ if( $n = $this->mTitle->isDeleted() ) {
+ $undelTitle = SpecialPage::getTitleFor( 'Undelete' );
+ $links['actions']['undelete'] = array(
+ 'class' => false,
+ 'text' => wfMsgExt(
+ 'vector-action-undelete',
+ array( 'parsemag' ),
+ $wgLang->formatNum( $n )
+ ),
+ 'href' => $undelTitle->getLocalUrl(
+ 'target=' . urlencode( $this->thispage )
+ )
+ );
+ }
+ }
+
+ if (
+ $this->mTitle->getNamespace() !== NS_MEDIAWIKI &&
+ $wgUser->isAllowed( 'protect' )
+ ) {
+ if ( !$this->mTitle->getRestrictions( 'create' ) ) {
+ $links['actions']['protect'] = array(
+ 'class' => ($action == 'protect') ?
+ 'selected' : false,
+ 'text' => wfMsg( 'vector-action-protect' ),
+ 'href' =>
+ $this->mTitle->getLocalUrl( 'action=protect' )
+ );
+
+ } else {
+ $links['actions']['unprotect'] = array(
+ 'class' => ($action == 'unprotect') ?
+ 'selected' : false,
+ 'text' => wfMsg( 'vector-action-unprotect' ),
+ 'href' =>
+ $this->mTitle->getLocalUrl( 'action=unprotect' )
+ );
+ }
+ }
+ }
+ wfProfileOut( __METHOD__ . '-live' );
+ /**
+ * The following actions use messages which, if made particular to
+ * the Planteome skin, would break the Ajax code which makes this
+ * action happen entirely inline. Skin::makeGlobalVariablesScript
+ * defines a set of messages in a javascript object - and these
+ * messages are assumed to be global for all skins. Without making
+ * a change to that procedure these messages will have to remain as
+ * the global versions.
+ */
+ // Checks if the user is logged in
+ if ( $this->loggedin ) {
+ if ( $wgPlanteomeUseIconWatch ) {
+ $class = 'icon ';
+ $place = 'views';
+ } else {
+ $class = '';
+ $place = 'actions';
+ }
+ $mode = $this->mTitle->userIsWatching() ? 'unwatch' : 'watch';
+ $links[$place][$mode] = array(
+ 'class' => $class . ( ( $action == 'watch' || $action == 'unwatch' ) ? ' selected' : false ),
+ 'text' => wfMsg( $mode ), // uses 'watch' or 'unwatch' message
+ 'href' => $this->mTitle->getLocalUrl( 'action=' . $mode )
+ );
+ }
+ // This is instead of SkinTemplateTabs - which uses a flat array
+ wfRunHooks( 'SkinTemplateNavigation', array( &$this, &$links ) );
+
+ // If it's not content, it's got to be a special page
+ } else {
+ $links['namespaces']['special'] = array(
+ 'class' => 'selected',
+ 'text' => wfMsg( 'vector-namespace-special' ),
+ 'href' => $wgRequest->getRequestURL()
+ );
+ }
+
+ // Gets list of language variants
+ $variants = $wgContLang->getVariants();
+ // Checks that language conversion is enabled and variants exist
+ if( !$wgDisableLangConversion && count( $variants ) > 1 ) {
+ // Gets preferred variant
+ $preferred = $wgContLang->getPreferredVariant();
+ // Loops over each variant
+ foreach( $variants as $code ) {
+ // Gets variant name from language code
+ $varname = $wgContLang->getVariantname( $code );
+ // Checks if the variant is marked as disabled
+ if( $varname == 'disable' ) {
+ // Skips this variant
+ continue;
+ }
+ // Appends variant link
+ $links['variants'][] = array(
+ 'class' => ( $code == $preferred ) ? 'selected' : false,
+ 'text' => $varname,
+ 'href' => $this->mTitle->getLocalURL( '', $code )
+ );
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+
+ return $links;
+ }
+}
+
+/**
+ * QuickTemplate class for Planteome skin
+ * @ingroup Skins
+ */
+class PlanteomeTemplate extends QuickTemplate {
+
+ /* Members */
+
+ /**
+ * @var Cached skin object
+ */
+ var $skin;
+
+ /* Functions */
+
+ /**
+ * Outputs the entire contents of the XHTML page
+ */
+ public function execute() {
+ global $wgRequest, $wgOut, $wgContLang;
+
+ $this->skin = $this->data['skin'];
+ $action = $wgRequest->getText( 'action' );
+
+ // Build additional attributes for navigation urls
+ $nav = $this->skin->buildNavigationUrls();
+ foreach ( $nav as $section => $links ) {
+ foreach ( $links as $key => $link ) {
+ $xmlID = $key;
+ if ( isset( $link['context'] ) && $link['context'] == 'subject' ) {
+ $xmlID = 'ca-nstab-' . $xmlID;
+ } else if ( isset( $link['context'] ) && $link['context'] == 'talk' ) {
+ $xmlID = 'ca-talk';
+ } else {
+ $xmlID = 'ca-' . $xmlID;
+ }
+ $nav[$section][$key]['attributes'] =
+ ' id="' . Sanitizer::escapeId( $xmlID ) . '"';
+ if ( $nav[$section][$key]['class'] ) {
+ $nav[$section][$key]['attributes'] .=
+ ' class="' . htmlspecialchars( $link['class'] ) . '"';
+ unset( $nav[$section][$key]['class'] );
+ }
+ // We don't want to give the watch tab an accesskey if the page
+ // is being edited, because that conflicts with the accesskey on
+ // the watch checkbox. We also don't want to give the edit tab
+ // an accesskey, because that's fairly superfluous and conflicts
+ // with an accesskey (Ctrl-E) often used for editing in Safari.
+ if (
+ in_array( $action, array( 'edit', 'submit' ) ) &&
+ in_array( $key, array( 'edit', 'watch', 'unwatch' ) )
+ ) {
+ $nav[$section][$key]['key'] =
+ $this->skin->tooltip( $xmlID );
+ } else {
+ $nav[$section][$key]['key'] =
+ $this->skin->tooltipAndAccesskey( $xmlID );
+ }
+ }
+ }
+ $this->data['namespace_urls'] = $nav['namespaces'];
+ $this->data['view_urls'] = $nav['views'];
+ $this->data['action_urls'] = $nav['actions'];
+ $this->data['variant_urls'] = $nav['variants'];
+ // Build additional attributes for personal_urls
+ foreach ( $this->data['personal_urls'] as $key => $item) {
+ $this->data['personal_urls'][$key]['attributes'] =
+ ' id="' . Sanitizer::escapeId( "pt-$key" ) . '"';
+ if ( isset( $item['active'] ) && $item['active'] ) {
+ $this->data['personal_urls'][$key]['attributes'] .=
+ ' class="active"';
+ }
+ $this->data['personal_urls'][$key]['key'] =
+ $this->skin->tooltipAndAccesskey('pt-'.$key);
+ }
+
+ // Generate additional footer links
+ $footerlinks = array(
+ 'info' => array(
+ 'lastmod',
+ 'viewcount',
+ 'numberofwatchingusers',
+ 'credits',
+ 'copyright',
+ 'tagline',
+ ),
+ 'places' => array(
+ 'privacy',
+ 'about',
+ 'disclaimer',
+ ),
+ );
+ // Reduce footer links down to only those which are being used
+ $validFooterLinks = array();
+ foreach( $footerlinks as $category => $links ) {
+ $validFooterLinks[$category] = array();
+ foreach( $links as $link ) {
+ if( isset( $this->data[$link] ) && $this->data[$link] ) {
+ $validFooterLinks[$category][] = $link;
+ }
+ }
+ }
+ // Reverse horizontally rendered navigation elements
+ if ( $wgContLang->isRTL() ) {
+ $this->data['view_urls'] =
+ array_reverse( $this->data['view_urls'] );
+ $this->data['namespace_urls'] =
+ array_reverse( $this->data['namespace_urls'] );
+ $this->data['personal_urls'] =
+ array_reverse( $this->data['personal_urls'] );
+ }
+ // Output HTML Page
+ $this->html( 'headelement' );
+?>
+ <div id="mw-page-base" class="noprint"></div>
+ <div id="mw-head-base" class="noprint"></div>
+ <!-- content -->
+ <div id="content" <?php $this->html('specialpageattributes') ?>>
+ <a id="top"></a>
+ <div id="mw-js-message" style="display:none;"<?php $this->html('userlangattributes') ?>></div>
+ <?php if ( $this->data['sitenotice'] ): ?>
+ <!-- sitenotice -->
+ <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
+ <!-- /sitenotice -->
+ <?php endif; ?>
+ <!-- firstHeading -->
+ <h1 id="firstHeading" class="firstHeading"><?php $this->html( 'title' ) ?></h1>
+ <!-- /firstHeading -->
+ <!-- bodyContent -->
+ <div id="bodyContent">
+ <!-- tagline -->
+ <h3 id="siteSub"><?php $this->msg( 'tagline' ) ?></h3>
+ <!-- /tagline -->
+ <!-- subtitle -->
+ <div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html( 'subtitle' ) ?></div>
+ <!-- /subtitle -->
+ <?php if ( $this->data['undelete'] ): ?>
+ <!-- undelete -->
+ <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+ <!-- /undelete -->
+ <?php endif; ?>
+ <?php if($this->data['newtalk'] ): ?>
+ <!-- newtalk -->
+ <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+ <!-- /newtalk -->
+ <?php endif; ?>
+ <?php if ( $this->data['showjumplinks'] ): ?>
+ <!-- jumpto -->
+ <div id="jump-to-nav">
+ <?php $this->msg( 'jumpto' ) ?> <a href="#mw-head"><?php $this->msg( 'jumptonavigation' ) ?></a>,
+ <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
+ </div>
+ <!-- /jumpto -->
+ <?php endif; ?>
+ <!-- bodytext -->
+ <?php $this->html( 'bodytext' ) ?>
+ <!-- /bodytext -->
+ <?php if ( $this->data['catlinks'] ): ?>
+ <!-- catlinks -->
+ <?php $this->html( 'catlinks' ); ?>
+ <!-- /catlinks -->
+ <?php endif; ?>
+ <?php if ( $this->data['dataAfterContent'] ): ?>
+ <!-- dataAfterContent -->
+ <?php $this->html( 'dataAfterContent' ); ?>
+ <!-- /dataAfterContent -->
+ <?php endif; ?>
+ <div class="visualClear"></div>
+ </div>
+ <!-- /bodyContent -->
+ </div>
+ <!-- /content -->
+ <!-- header -->
+ <div id="mw-head" class="noprint">
+ <?php $this->renderNavigation( 'PERSONAL' ); ?>
+ <div id="left-navigation">
+ <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?>
+ </div>
+ <div id="right-navigation">
+ <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
+ </div>
+ </div>
+ <!-- /header -->
+ <!-- panel -->
+ <div id="mw-panel" class="noprint">
+ <!-- logo -->
+ <div id="p-logo"><a style="background-image: url(<?php $this->text( 'logopath' ) ?>);" href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>" <?php echo $this->skin->tooltipAndAccesskey( 'p-logo' ) ?>></a></div>
+ <!-- /logo -->
+ <?php $this->renderPortals( $this->data['sidebar'] ); ?>
+ </div>
+ <!-- /panel -->
+ <!-- footer -->
+ <div id="footer"<?php $this->html('userlangattributes') ?>>
+ <?php foreach( $validFooterLinks as $category => $links ): ?>
+ <?php if ( count( $links ) > 0 ): ?>
+ <ul id="footer-<?php echo $category ?>">
+ <?php foreach( $links as $link ): ?>
+ <?php if( isset( $this->data[$link] ) && $this->data[$link] ): ?>
+ <li id="footer-<?php echo $category ?>-<?php echo $link ?>"><?php $this->html( $link ) ?></li>
+ <?php endif; ?>
+ <?php endforeach; ?>
+ </ul>
+ <?php endif; ?>
+ <?php endforeach; ?>
+ <ul id="footer-icons" class="noprint">
+ <?php if ( $this->data['poweredbyico'] ): ?>
+ <li id="footer-icon-poweredby"><?php $this->html( 'poweredbyico' ) ?></li>
+ <?php endif; ?>
+ <?php if ( $this->data['copyrightico'] ): ?>
+ <li id="footer-icon-copyright"><?php $this->html( 'copyrightico' ) ?></li>
+ <?php endif; ?>
+ </ul>
+ <div style="clear:both"></div>
+ </div>
+ <!-- /footer -->
+ <!-- fixalpha -->
+ <script type="<?php $this->text('jsmimetype') ?>"> if ( window.isMSIE55 ) fixalpha(); </script>
+ <!-- /fixalpha -->
+ <?php $this->html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?>
+ <?php $this->html( 'reporttime' ) ?>
+ <?php if ( $this->data['debug'] ): ?>
+ <!-- Debug output: <?php $this->text( 'debug' ); ?> -->
+ <?php endif; ?>
+ </body>
+</html>
+<?php
+ }
+
+ /**
+ * Render a series of portals
+ */
+ private function renderPortals( $portals ) {
+ // Force the rendering of the following portals
+ if ( !isset( $portals['SEARCH'] ) ) $portals['SEARCH'] = true;
+ if ( !isset( $portals['TOOLBOX'] ) ) $portals['TOOLBOX'] = true;
+ if ( !isset( $portals['LANGUAGES'] ) ) $portals['LANGUAGES'] = true;
+ // Render portals
+ foreach ( $portals as $name => $content ) {
+ echo "\n<!-- {$name} -->\n";
+ switch( $name ) {
+ case 'SEARCH':
+ break;
+ case 'TOOLBOX':
+?>
+<div class="portal" id="p-tb">
+ <h5<?php $this->html('userlangattributes') ?>><?php $this->msg( 'toolbox' ) ?></h5>
+ <div class="body">
+ <ul>
+ <?php if( $this->data['notspecialpage'] ): ?>
+ <li id="t-whatlinkshere"><a href="<?php echo htmlspecialchars( $this->data['nav_urls']['whatlinkshere']['href'] ) ?>"<?php echo $this->skin->tooltipAndAccesskey( 't-whatlinkshere' ) ?>><?php $this->msg( 'whatlinkshere' ) ?></a></li>
+ <?php if( $this->data['nav_urls']['recentchangeslinked'] ): ?>
+ <li id="t-recentchangeslinked"><a href="<?php echo htmlspecialchars( $this->data['nav_urls']['recentchangeslinked']['href'] ) ?>"<?php echo $this->skin->tooltipAndAccesskey( 't-recentchangeslinked' ) ?>><?php $this->msg( 'recentchangeslinked-toolbox' ) ?></a></li>
+ <?php endif; ?>
+ <?php endif; ?>
+ <?php if( isset( $this->data['nav_urls']['trackbacklink'] ) ): ?>
+ <li id="t-trackbacklink"><a href="<?php echo htmlspecialchars( $this->data['nav_urls']['trackbacklink']['href'] ) ?>"<?php echo $this->skin->tooltipAndAccesskey( 't-trackbacklink' ) ?>><?php $this->msg( 'trackbacklink' ) ?></a></li>
+ <?php endif; ?>
+ <?php if( $this->data['feeds']): ?>
+ <li id="feedlinks">
+ <?php foreach( $this->data['feeds'] as $key => $feed ): ?>
+ <a id="<?php echo Sanitizer::escapeId( "feed-$key" ) ?>" href="<?php echo htmlspecialchars( $feed['href'] ) ?>" rel="alternate" type="application/<?php echo $key ?>+xml" class="feedlink"<?php echo $this->skin->tooltipAndAccesskey( 'feed-' . $key ) ?>><?php echo htmlspecialchars( $feed['text'] ) ?></a>
+ <?php endforeach; ?>
+ </li>
+ <?php endif; ?>
+ <?php foreach( array( 'contributions', 'log', 'blockip', 'emailuser', 'upload', 'specialpages' ) as $special ): ?>
+ <?php if( $this->data['nav_urls'][$special]): ?>
+ <li id="t-<?php echo $special ?>"><a href="<?php echo htmlspecialchars( $this->data['nav_urls'][$special]['href'] ) ?>"<?php echo $this->skin->tooltipAndAccesskey( 't-' . $special ) ?>><?php $this->msg( $special ) ?></a></li>
+ <?php endif; ?>
+ <?php endforeach; ?>
+ <?php if( !empty( $this->data['nav_urls']['print']['href'] ) ): ?>
+ <li id="t-print"><a href="<?php echo htmlspecialchars( $this->data['nav_urls']['print']['href'] ) ?>" rel="alternate"<?php echo $this->skin->tooltipAndAccesskey( 't-print' ) ?>><?php $this->msg( 'printableversion' ) ?></a></li>
+ <?php endif; ?>
+ <?php if ( !empty( $this->data['nav_urls']['permalink']['href'] ) ): ?>
+ <li id="t-permalink"><a href="<?php echo htmlspecialchars( $this->data['nav_urls']['permalink']['href'] ) ?>"<?php echo $this->skin->tooltipAndAccesskey( 't-permalink' ) ?>><?php $this->msg( 'permalink' ) ?></a></li>
+ <?php elseif ( $this->data['nav_urls']['permalink']['href'] === '' ): ?>
+ <li id="t-ispermalink"<?php echo $this->skin->tooltip( 't-ispermalink' ) ?>><?php $this->msg( 'permalink' ) ?></li>
+ <?php endif; ?>
+ <?php wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this ) ); ?>
+ </ul>
+ </div>
+</div>
+<?php
+ break;
+ case 'LANGUAGES':
+ if ( $this->data['language_urls'] ) {
+?>
+<div class="portal" id="p-lang">
+ <h5<?php $this->html('userlangattributes') ?>><?php $this->msg( 'otherlanguages' ) ?></h5>
+ <div class="body">
+ <ul>
+ <?php foreach ( $this->data['language_urls'] as $langlink ): ?>
+ <li class="<?php echo htmlspecialchars( $langlink['class'] ) ?>"><a href="<?php echo htmlspecialchars( $langlink['href'] ) ?>"><?php echo $langlink['text'] ?></a></li>
+ <?php endforeach; ?>
+ </ul>
+ </div>
+</div>
+<?php
+ }
+ break;
+ default:
+?>
+<div class="portal" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo $this->skin->tooltip( 'p-' . $name ) ?>>
+ <h5<?php $this->html('userlangattributes') ?>><?php $out = wfMsg( $name ); if ( wfEmptyMsg( $name, $out ) ) echo htmlspecialchars( $name ); else echo htmlspecialchars( $out ); ?></h5>
+ <div class="body">
+ <?php if ( is_array( $content ) ): ?>
+ <ul>
+ <?php foreach( $content as $key => $val ): ?>
+ <li id="<?php echo Sanitizer::escapeId( $val['id'] ) ?>"<?php if ( $val['active'] ): ?> class="active" <?php endif; ?>><a href="<?php echo htmlspecialchars( $val['href'] ) ?>"<?php echo $this->skin->tooltipAndAccesskey( $val['id'] ) ?>><?php echo htmlspecialchars( $val['text'] ) ?></a></li>
+ <?php endforeach; ?>
+ </ul>
+ <?php else: ?>
+ <?php echo $content; /* Allow raw HTML block to be defined by extensions */ ?>
+ <?php endif; ?>
+ </div>
+</div>
+<?php
+ break;
+ }
+ echo "\n<!-- /{$name} -->\n";
+ }
+ }
+
+ /**
+ * Render one or more navigations elements by name, automatically reveresed
+ * when UI is in RTL mode
+ */
+ private function renderNavigation( $elements ) {
+ global $wgContLang, $wgPlanteomeUseSimpleSearch, $wgStylePath;
+
+ // If only one element was given, wrap it in an array, allowing more
+ // flexible arguments
+ if ( !is_array( $elements ) ) {
+ $elements = array( $elements );
+ // If there's a series of elements, reverse them when in RTL mode
+ } else if ( $wgContLang->isRTL() ) {
+ $elements = array_reverse( $elements );
+ }
+ // Render elements
+ foreach ( $elements as $name => $element ) {
+ echo "\n<!-- {$name} -->\n";
+ switch ( $element ) {
+ case 'NAMESPACES':
+?>
+<div id="p-namespaces" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+ <h5><?php $this->msg('namespaces') ?></h5>
+ <ul<?php $this->html('userlangattributes') ?>>
+ <?php foreach ($this->data['namespace_urls'] as $key => $link ): ?>
+ <li <?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><span><?php echo htmlspecialchars( $link['text'] ) ?></span></a></li>
+ <?php endforeach; ?>
+ </ul>
+</div>
+<?php
+ break;
+ case 'VARIANTS':
+?>
+<div id="p-variants" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+ <h5><span><?php $this->msg('variants') ?></span><a href="#"></a></h5>
+ <div class="menu">
+ <ul<?php $this->html('userlangattributes') ?>>
+ <?php foreach ($this->data['variant_urls'] as $key => $link ): ?>
+ <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
+ <?php endforeach; ?>
+ </ul>
+ </div>
+</div>
+<?php
+ break;
+ case 'VIEWS':
+?>
+<div id="p-views" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+ <h5><?php $this->msg('views') ?></h5>
+ <ul<?php $this->html('userlangattributes') ?>>
+ <?php foreach ($this->data['view_urls'] as $key => $link ): ?>
+ <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo (array_key_exists('img',$link) ? '<img src="'.$link['img'].'" alt="'.$link['text'].'" />' : '<span>'.htmlspecialchars( $link['text'] ).'</span>') ?></a></li>
+ <?php endforeach; ?>
+ </ul>
+</div>
+<?php
+ break;
+ case 'ACTIONS':
+?>
+<div id="p-cactions" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+ <h5><span><?php $this->msg('actions') ?></span><a href="#"></a></h5>
+ <div class="menu">
+ <ul<?php $this->html('userlangattributes') ?>>
+ <?php foreach ($this->data['action_urls'] as $key => $link ): ?>
+ <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
+ <?php endforeach; ?>
+ </ul>
+ </div>
+</div>
+<?php
+ break;
+ case 'PERSONAL':
+?>
+<div id="p-personal" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+ <h5><?php $this->msg('personaltools') ?></h5>
+ <ul<?php $this->html('userlangattributes') ?>>
+ <?php foreach($this->data['personal_urls'] as $key => $item): ?>
+ <li <?php echo $item['attributes'] ?>><a href="<?php echo htmlspecialchars($item['href']) ?>"<?php echo $item['key'] ?><?php if(!empty($item['class'])): ?> class="<?php echo htmlspecialchars($item['class']) ?>"<?php endif; ?>><?php echo htmlspecialchars($item['text']) ?></a></li>
+ <?php endforeach; ?>
+ </ul>
+</div>
+<?php
+ break;
+ case 'SEARCH':
+?>
+<div id="p-search">
+ <h5<?php $this->html('userlangattributes') ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h5>
+ <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+ <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+ <?php if ( $wgPlanteomeUseSimpleSearch ): ?>
+ <div id="simpleSearch">
+ <input id="searchInput" name="search" type="text" <?php echo $this->skin->tooltipAndAccesskey( 'search' ); ?> <?php if( isset( $this->data['search'] ) ): ?> value="<?php $this->text( 'search' ) ?>"<?php endif; ?> />
+ <button id="searchButton" type='submit' name='button' <?php echo $this->skin->tooltipAndAccesskey( 'search-fulltext' ); ?>> </button>
+ </div>
+ <?php else: ?>
+ <input id="searchInput" name="search" type="text" <?php echo $this->skin->tooltipAndAccesskey( 'search' ); ?> <?php if( isset( $this->data['search'] ) ): ?> value="<?php $this->text( 'search' ) ?>"<?php endif; ?> />
+ <input type='submit' name="go" class="searchButton" id="searchGoButton" value="<?php $this->msg( 'searcharticle' ) ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-go' ); ?> />
+ <input type="submit" name="fulltext" class="searchButton" id="mw-searchButton" value="<?php $this->msg( 'searchbutton' ) ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-fulltext' ); ?> />
+ <?php endif; ?>
+ </form>
+</div>
+<?php
+
+ break;
+ }
+ echo "\n<!-- /{$name} -->\n";
+ }
+ }
+}
--- /dev/null
+#
+# Handy makefile to build the RTL variant with cssjanus
+#
+
+all: main-rtl.css
+
+main-rtl.css: main-ltr.css cssjanus/cssjanus.py
+ python cssjanus/cssjanus.py --swap_ltr_rtl_in_url < main-ltr.css > main-rtl.css
+
+# SVN version is broken; checking in our own.
+#cssjanus/cssjanus.py:
+# svn co http://cssjanus.googlecode.com/svn/trunk cssjanus
+
+#distclean: clean
+# rm -rf cssjanus
+
+clean:
+ rm -f main-rtl.css
--- /dev/null
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+// <?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i,
+ REG_AFFECTED = /(.*?)\:(hover|active|focus)/i,
+ REG_PSEUDO = /[^:]+:([a-z-]+).*/i,
+ REG_SELECT = /(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi,
+ REG_CLASS = /\.([a-z0-9_-]*on(hover|active|focus))/i,
+ REG_MSIE = /msie (5|6|7)/i,
+ REG_COMPAT = /backcompat/i;
+
+ // css prefix, a leading dash would be nice (spec), but IE6 doesn't like that.
+ var CSSHOVER_PREFIX = 'csh-';
+
+ /**
+ * Local CSSHover object
+ * --------------------------
+ */
+
+ var CSSHover = {
+
+ // array of CSSHoverElements, used to unload created events
+ elements: [],
+
+ // buffer used for checking on duplicate expressions
+ callbacks: {},
+
+ // init, called once ondomcontentready via the exposed window.CSSHover function
+ init:function() {
+ // don't run in IE8 standards; expressions don't work in standards mode anyway,
+ // and the stuff we're trying to fix should already work properly
+ if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) return;
+
+ // start parsing the existing stylesheets
+ var sheets = window.document.styleSheets, l = sheets.length;
+ for(var i=0; i<l; i++) {
+ this.parseStylesheet(sheets[i]);
+ }
+ },
+
+ // called from init, parses individual stylesheets
+ parseStylesheet:function(sheet) {
+ // check sheet imports and parse those recursively
+ if(sheet.imports) {
+ try {
+ var imports = sheet.imports, l = imports.length;
+ for(var i=0; i<l; i++) {
+ this.parseStylesheet(sheet.imports[i]);
+ }
+ } catch(securityException){
+ // trycatch for various possible errors,
+ // todo; might need to be placed inside the for loop, since an error
+ // on an import stops following imports from being processed.
+ }
+ }
+
+ // interate the sheet's rules and send them to the parser
+ try {
+ var rules = sheet.rules, l = rules.length;
+ for(var j=0; j<l; j++) {
+ this.parseCSSRule(rules[j], sheet);
+ }
+ } catch(securityException){
+ // trycatch for various errors, most likely accessing the sheet's rules,
+ // don't see how individual rules would throw errors, but you never know.
+ }
+ },
+
+ // magic starts here ...
+ parseCSSRule:function(rule, sheet) {
+
+ // The sheet is used to insert new rules into, this must be the same sheet the rule
+ // came from, to ensure that relative paths keep pointing to the right location.
+
+ // only parse a rule if it contains an interactive pseudo.
+ var select = rule.selectorText;
+ if(REG_INTERACTIVE.test(select)) {
+ var style = rule.style.cssText,
+
+ // affected elements are found by truncating the selector after the interactive pseudo,
+ // eg: "div li:hover" >> "div li"
+ affected = REG_AFFECTED.exec(select)[1],
+
+ // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
+ // eg: "li:hover" >> "onhover"
+ pseudo = select.replace(REG_PSEUDO, 'on$1'),
+
+ // the new selector is going to use that classname in a new css rule,
+ // since IE6 doesn't support multiple classnames, this is merged into one classname
+ // eg: "li:hover" >> "li.onhover", "li.folder:hover" >> "li.folderonhover"
+ newSelect = select.replace(REG_SELECT, '.$2' + pseudo),
+
+ // the classname is needed for the events that are going to be set on affected nodes
+ // eg: "li.folder:hover" >> "folderonhover"
+ className = REG_CLASS.exec(newSelect)[1];
+
+ // no need to set the same callback more than once when the same selector uses the same classname
+ var hash = affected + className;
+ if(!this.callbacks[hash]) {
+
+ // affected elements are given an expression under a fake css property, the classname is used
+ // because a unique name (eg "behavior:") would be overruled (in IE6, not 7) by a following rule
+ // selecting the same element. The expression does a callback to CSSHover.patch, rerouted via the
+ // exposed window.CSSHover function.
+
+ // because the expression is added to the stylesheet, and styles are always applied to html that is
+ // dynamically added to the dom, the expression will also trigger for those new elements (provided
+ // they are selected by the affected selector).
+
+ sheet.addRule(affected, CSSHOVER_PREFIX + className + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'"))');
+
+ // hash it, so an identical selector/class combo does not duplicate the expression
+ this.callbacks[hash] = true;
+ }
+
+ // duplicate expressions need not be set, but the style could differ
+ sheet.addRule(newSelect, style);
+ }
+ },
+
+ // called via the expression, patches individual nodes
+ patch:function(node, type, className) {
+
+ // the patch's type is returned to the expression. That way the expression property
+ // can be found and removed, to stop it from calling patch over and over.
+ // The if will fail the first time, since the expression has not yet received a value.
+ var property = CSSHOVER_PREFIX + className;
+ if(node.style[property]) {
+ node.style[property] = null;
+ }
+
+ // just to make sure, also keep track of patched classnames locally on the node
+ if(!node.csshover) node.csshover = [];
+
+ // and check for it to prevent duplicate events with the same classname from being set
+ if(!node.csshover[className]) {
+ node.csshover[className] = true;
+
+ // create an instance for the given type and class
+ var element = new CSSHoverElement(node, type, className);
+
+ // and store that instance for unloading later on
+ this.elements.push(element);
+ }
+
+ // returns a dummy value to the expression
+ return type;
+ },
+
+ // unload stuff onbeforeunload
+ unload:function() {
+ try {
+
+ // remove events
+ var l = this.elements.length;
+ for(var i=0; i<l; i++) {
+ this.elements[i].unload();
+ }
+
+ // and set properties to null
+ this.elements = [];
+ this.callbacks = {};
+
+ } catch (e) {
+ }
+ }
+ };
+
+ // add the unload to the onbeforeunload event
+ window.attachEvent('onbeforeunload', function(){
+ CSSHover.unload();
+ });
+
+ /**
+ * CSSHoverElement
+ * --------------------------
+ */
+
+ // the event types associated with the interactive pseudos
+ var CSSEvents = {
+ onhover: { activator: 'onmouseenter', deactivator: 'onmouseleave' },
+ onactive: { activator: 'onmousedown', deactivator: 'onmouseup' },
+ onfocus: { activator: 'onfocus', deactivator: 'onblur' }
+ };
+
+ // CSSHoverElement constructor, called via CSSHover.patch
+ function CSSHoverElement(node, type, className) {
+
+ // the CSSHoverElement patches individual nodes by manually applying the events that should
+ // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover.
+
+ this.node = node;
+ this.type = type;
+ var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g');
+
+ // store event handlers for removal onunload
+ this.activator = function(){ node.className += ' ' + className; };
+ this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); };
+
+ // add the events
+ node.attachEvent(CSSEvents[type].activator, this.activator);
+ node.attachEvent(CSSEvents[type].deactivator, this.deactivator);
+ }
+
+ CSSHoverElement.prototype = {
+ // onbeforeunload, called via CSSHover.unload
+ unload:function() {
+
+ // remove events
+ this.node.detachEvent(CSSEvents[this.type].activator, this.activator);
+ this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator);
+
+ // and set properties to null
+ this.activator = null;
+ this.deactivator = null;
+ this.node = null;
+ this.type = null;
+ }
+ };
+
+ /**
+ * Public hook
+ * --------------------------
+ */
+
+ return function(node, type, className) {
+ if(node) {
+ // called via the css expression; patches individual nodes
+ return CSSHover.patch(node, type, className);
+ } else {
+ // called ondomcontentready via the public:attach node
+ CSSHover.init();
+ }
+ };
+
+})();
+
+// ]]>
+</script>
\ No newline at end of file
--- /dev/null
+ Copyright 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
--- /dev/null
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
--- /dev/null
+=CSSJanus=
+
+_Flips CSS from LTR to an RTL orienation and vice-versa_
+
+Author: `Lindsey Simon <elsigh@google.com>`
+
+==Introduction==
+
+CSSJanus is CSS parser utility designed to aid the conversion of a website's
+layout from left-to-right(LTR) to right-to-left(RTL). The script was born out of
+a need to convert CSS for RTL languages when tables are not being used for layout (since tables will automatically reorder TD's in RTL).
+CSSJanus will change most of the obvious CSS property names and their values as
+well as some not-so-obvious ones (cursor, background-position %, etc...).
+The script is designed to offer flexibility to account for cases when you do
+not want to change certain rules which exist to account for bidirectional text
+display bugs, as well as situations where you may or may not want to flip annotations inside of the background url string.
+Note that you can disable CSSJanus from running on an entire class or any
+rule within a class by prepending a /* @noflip */ comment before the rule(s)
+you want CSSJanus to ignore.
+
+CSSJanus itself is not always enough to make a website that works in a LTR
+language context work in a RTL language all the way, but it is a start.
+
+==Getting the code==
+
+View the trunk at:
+
+ http://cssjanus.googlecode.com/svn/trunk/
+
+Check out the latest development version anonymously with:
+
+{{{
+ $ svn checkout http://cssjanus.googlecode.com/svn/trunk/ cssjanus
+}}}
+
+==Using==
+
+Usage:
+ ./cssjanus.py < file.css > file-rtl.css
+Flags:
+ --swap_left_right_in_url: Fixes "left"/"right" string within urls.
+ Ex: ./cssjanus.py --swap_left_right_in_url < file.css > file_rtl.css
+ --swap_ltr_rtl_in_url: Fixes "ltr"/"rtl" string within urls.
+ Ex: ./cssjanus.py --swap_ltr_rtl_in_url < file.css > file_rtl.css
+
+If you'd like to make use of the webapp version of cssjanus, you'll need to
+download the Google App Engine SDK
+ http://code.google.com/appengine/downloads.html
+and also drop a "django" directory into this directory, with the latest svn
+from django. You should be good to go with that setup. Please let me know
+otherwise.
+
+==Bugs, Patches==
+
+Patches and bug reports are welcome, just please keep the style
+consistent with the original source. If you find a bug, please include a diff
+of cssjanus_test.py with the bug included as a new unit test which fails. It
+will make understanding and fixing the bug easier.
+
+==Todo==
+
+* Include some helpers for some typical bidi text solutions?
+* Aural CSS (azimuth) swapping?
+
+==Contributors==
+
+Additional thanks to Mike Samuel for his work on csslex.py, Andy Perelson for
+his help coding and reviewing, Stephen Zabel for his help with i18n and my sanity,
+and to Eric Meyer for his thoughtful input.
+Thanks to Junyu Wang for the Chinese translation.
+Thanks to Masashi Kawashima for the Japanese translation.
+Thanks to Taaryk Taar and Tariq Al-Omaireeni for an updated Arabic translation.
+Thanks to Jens Meiert for the German translation.
+
+==License==
+
+{{{
+ Copyright 2008 Google Inc. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the 'License');
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an 'AS IS' BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+}}}
--- /dev/null
+#!/usr/bin/python
+#
+# Copyright 2008 Google Inc. All Rights Reserved.
+
+"""Converts a LeftToRight Cascading Style Sheet into a RightToLeft one.
+
+ This is a utility script for replacing "left" oriented things in a CSS file
+ like float, padding, margin with "right" oriented values.
+ It also does the opposite.
+ The goal is to be able to conditionally serve one large, cat'd, compiled CSS
+ file appropriate for LeftToRight oriented languages and RightToLeft ones.
+ This utility will hopefully help your structural layout done in CSS in
+ terms of its RTL compatibility. It will not help with some of the more
+ complicated bidirectional text issues.
+"""
+
+__author__ = 'elsigh@google.com (Lindsey Simon)'
+__version__ = '0.1'
+
+import logging
+import re
+import sys
+import getopt
+import os
+
+import csslex
+
+logging.getLogger().setLevel(logging.INFO)
+
+# Global for the command line flags.
+SWAP_LTR_RTL_IN_URL_DEFAULT = False
+SWAP_LEFT_RIGHT_IN_URL_DEFAULT = False
+FLAGS = {'swap_ltr_rtl_in_url': SWAP_LTR_RTL_IN_URL_DEFAULT,
+ 'swap_left_right_in_url': SWAP_LEFT_RIGHT_IN_URL_DEFAULT}
+
+# Generic token delimiter character.
+TOKEN_DELIMITER = '~'
+
+# This is a temporary match token we use when swapping strings.
+TMP_TOKEN = '%sTMP%s' % (TOKEN_DELIMITER, TOKEN_DELIMITER)
+
+# Token to be used for joining lines.
+TOKEN_LINES = '%sJ%s' % (TOKEN_DELIMITER, TOKEN_DELIMITER)
+
+# Global constant text strings for CSS value matches.
+LTR = 'ltr'
+RTL = 'rtl'
+LEFT = 'left'
+RIGHT = 'right'
+
+# This is a lookbehind match to ensure that we don't replace instances
+# of our string token (left, rtl, etc...) if there's a letter in front of it.
+# Specifically, this prevents replacements like 'background: url(bright.png)'.
+LOOKBEHIND_NOT_LETTER = r'(?<![a-zA-Z])'
+
+# This is a lookahead match to make sure we don't replace left and right
+# in actual classnames, so that we don't break the HTML/CSS dependencies.
+# Read literally, it says ignore cases where the word left, for instance, is
+# directly followed by valid classname characters and a curly brace.
+# ex: .column-left {float: left} will become .column-left {float: right}
+LOOKAHEAD_NOT_OPEN_BRACE = (r'(?!(?:%s|%s|%s|#|\:|\.|\,|\+|>)*?{)' %
+ (csslex.NMCHAR, TOKEN_LINES, csslex.SPACE))
+
+
+# These two lookaheads are to test whether or not we are within a
+# background: url(HERE) situation.
+# Ref: http://www.w3.org/TR/CSS21/syndata.html#uri
+VALID_AFTER_URI_CHARS = r'[\'\"]?%s' % csslex.WHITESPACE
+LOOKAHEAD_NOT_CLOSING_PAREN = r'(?!%s?%s\))' % (csslex.URL_CHARS,
+ VALID_AFTER_URI_CHARS)
+LOOKAHEAD_FOR_CLOSING_PAREN = r'(?=%s?%s\))' % (csslex.URL_CHARS,
+ VALID_AFTER_URI_CHARS)
+
+# Compile a regex to swap left and right values in 4 part notations.
+# We need to match negatives and decimal numeric values.
+# ex. 'margin: .25em -2px 3px 0' becomes 'margin: .25em 0 3px -2px'.
+POSSIBLY_NEGATIVE_QUANTITY = r'((?:-?%s)|(?:inherit|auto))' % csslex.QUANTITY
+POSSIBLY_NEGATIVE_QUANTITY_SPACE = r'%s%s%s' % (POSSIBLY_NEGATIVE_QUANTITY,
+ csslex.SPACE,
+ csslex.WHITESPACE)
+FOUR_NOTATION_QUANTITY_RE = re.compile(r'%s%s%s%s' %
+ (POSSIBLY_NEGATIVE_QUANTITY_SPACE,
+ POSSIBLY_NEGATIVE_QUANTITY_SPACE,
+ POSSIBLY_NEGATIVE_QUANTITY_SPACE,
+ POSSIBLY_NEGATIVE_QUANTITY),
+ re.I)
+COLOR = r'(%s|%s)' % (csslex.NAME, csslex.HASH)
+COLOR_SPACE = r'%s%s' % (COLOR, csslex.SPACE)
+FOUR_NOTATION_COLOR_RE = re.compile(r'(-color%s:%s)%s%s%s(%s)' %
+ (csslex.WHITESPACE,
+ csslex.WHITESPACE,
+ COLOR_SPACE,
+ COLOR_SPACE,
+ COLOR_SPACE,
+ COLOR),
+ re.I)
+
+# Compile the cursor resize regexes
+CURSOR_EAST_RE = re.compile(LOOKBEHIND_NOT_LETTER + '([ns]?)e-resize')
+CURSOR_WEST_RE = re.compile(LOOKBEHIND_NOT_LETTER + '([ns]?)w-resize')
+
+# Matches the condition where we need to replace the horizontal component
+# of a background-position value when expressed in horizontal percentage.
+# Had to make two regexes because in the case of position-x there is only
+# one quantity, and otherwise we don't want to match and change cases with only
+# one quantity.
+BG_HORIZONTAL_PERCENTAGE_RE = re.compile(r'background(-position)?(%s:%s)'
+ '([^%%]*?)(%s)%%'
+ '(%s(?:%s|%s))' % (csslex.WHITESPACE,
+ csslex.WHITESPACE,
+ csslex.NUM,
+ csslex.WHITESPACE,
+ csslex.QUANTITY,
+ csslex.IDENT))
+
+BG_HORIZONTAL_PERCENTAGE_X_RE = re.compile(r'background-position-x(%s:%s)'
+ '(%s)%%' % (csslex.WHITESPACE,
+ csslex.WHITESPACE,
+ csslex.NUM))
+
+# Matches the opening of a body selector.
+BODY_SELECTOR = r'body%s{%s' % (csslex.WHITESPACE, csslex.WHITESPACE)
+
+# Matches anything up until the closing of a selector.
+CHARS_WITHIN_SELECTOR = r'[^\}]*?'
+
+# Matches the direction property in a selector.
+DIRECTION_RE = r'direction%s:%s' % (csslex.WHITESPACE, csslex.WHITESPACE)
+
+# These allow us to swap "ltr" with "rtl" and vice versa ONLY within the
+# body selector and on the same line.
+BODY_DIRECTION_LTR_RE = re.compile(r'(%s)(%s)(%s)(ltr)' %
+ (BODY_SELECTOR, CHARS_WITHIN_SELECTOR,
+ DIRECTION_RE),
+ re.I)
+BODY_DIRECTION_RTL_RE = re.compile(r'(%s)(%s)(%s)(rtl)' %
+ (BODY_SELECTOR, CHARS_WITHIN_SELECTOR,
+ DIRECTION_RE),
+ re.I)
+
+
+# Allows us to swap "direction:ltr" with "direction:rtl" and
+# vice versa anywhere in a line.
+DIRECTION_LTR_RE = re.compile(r'%s(ltr)' % DIRECTION_RE)
+DIRECTION_RTL_RE = re.compile(r'%s(rtl)' % DIRECTION_RE)
+
+# We want to be able to switch left with right and vice versa anywhere
+# we encounter left/right strings, EXCEPT inside the background:url(). The next
+# two regexes are for that purpose. We have alternate IN_URL versions of the
+# regexes compiled in case the user passes the flag that they do
+# actually want to have left and right swapped inside of background:urls.
+LEFT_RE = re.compile('%s(%s)%s%s' % (LOOKBEHIND_NOT_LETTER,
+ LEFT,
+ LOOKAHEAD_NOT_CLOSING_PAREN,
+ LOOKAHEAD_NOT_OPEN_BRACE),
+ re.I)
+RIGHT_RE = re.compile('%s(%s)%s%s' % (LOOKBEHIND_NOT_LETTER,
+ RIGHT,
+ LOOKAHEAD_NOT_CLOSING_PAREN,
+ LOOKAHEAD_NOT_OPEN_BRACE),
+ re.I)
+LEFT_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
+ LEFT,
+ LOOKAHEAD_FOR_CLOSING_PAREN),
+ re.I)
+RIGHT_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
+ RIGHT,
+ LOOKAHEAD_FOR_CLOSING_PAREN),
+ re.I)
+LTR_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
+ LTR,
+ LOOKAHEAD_FOR_CLOSING_PAREN),
+ re.I)
+RTL_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
+ RTL,
+ LOOKAHEAD_FOR_CLOSING_PAREN),
+ re.I)
+
+COMMENT_RE = re.compile('(%s)' % csslex.COMMENT, re.I)
+
+NOFLIP_TOKEN = r'\@noflip'
+# The NOFLIP_TOKEN inside of a comment. For now, this requires that comments
+# be in the input, which means users of a css compiler would have to run
+# this script first if they want this functionality.
+NOFLIP_ANNOTATION = r'/\*%s%s%s\*/' % (csslex.WHITESPACE,
+ NOFLIP_TOKEN,
+ csslex. WHITESPACE)
+
+# After a NOFLIP_ANNOTATION, and within a class selector, we want to be able
+# to set aside a single rule not to be flipped. We can do this by matching
+# our NOFLIP annotation and then using a lookahead to make sure there is not
+# an opening brace before the match.
+NOFLIP_SINGLE_RE = re.compile(r'(%s%s[^;}]+;?)' % (NOFLIP_ANNOTATION,
+ LOOKAHEAD_NOT_OPEN_BRACE),
+ re.I)
+
+# After a NOFLIP_ANNOTATION, we want to grab anything up until the next } which
+# means the entire following class block. This will prevent all of its
+# declarations from being flipped.
+NOFLIP_CLASS_RE = re.compile(r'(%s%s})' % (NOFLIP_ANNOTATION,
+ CHARS_WITHIN_SELECTOR),
+ re.I)
+
+
+class Tokenizer:
+ """Replaces any CSS comments with string tokens and vice versa."""
+
+ def __init__(self, token_re, token_string):
+ """Constructor for the Tokenizer.
+
+ Args:
+ token_re: A regex for the string to be replace by a token.
+ token_string: The string to put between token delimiters when tokenizing.
+ """
+ logging.debug('Tokenizer::init token_string=%s' % token_string)
+ self.token_re = token_re
+ self.token_string = token_string
+ self.originals = []
+
+ def Tokenize(self, line):
+ """Replaces any string matching token_re in line with string tokens.
+
+ By passing a function as an argument to the re.sub line below, we bypass
+ the usual rule where re.sub will only replace the left-most occurrence of
+ a match by calling the passed in function for each occurrence.
+
+ Args:
+ line: A line to replace token_re matches in.
+
+ Returns:
+ line: A line with token_re matches tokenized.
+ """
+ line = self.token_re.sub(self.TokenizeMatches, line)
+ logging.debug('Tokenizer::Tokenize returns: %s' % line)
+ return line
+
+ def DeTokenize(self, line):
+ """Replaces tokens with the original string.
+
+ Args:
+ line: A line with tokens.
+
+ Returns:
+ line with any tokens replaced by the original string.
+ """
+
+ # Put all of the comments back in by their comment token.
+ for i, original in enumerate(self.originals):
+ token = '%s%s_%s%s' % (TOKEN_DELIMITER, self.token_string, i + 1,
+ TOKEN_DELIMITER)
+ line = line.replace(token, original)
+ logging.debug('Tokenizer::DeTokenize i:%s w/%s' % (i, token))
+ logging.debug('Tokenizer::DeTokenize returns: %s' % line)
+ return line
+
+ def TokenizeMatches(self, m):
+ """Replaces matches with tokens and stores the originals.
+
+ Args:
+ m: A match object.
+
+ Returns:
+ A string token which replaces the CSS comment.
+ """
+ logging.debug('Tokenizer::TokenizeMatches %s' % m.group(1))
+ self.originals.append(m.group(1))
+ return '%s%s_%s%s' % (TOKEN_DELIMITER,
+ self.token_string,
+ len(self.originals),
+ TOKEN_DELIMITER)
+
+
+def FixBodyDirectionLtrAndRtl(line):
+ """Replaces ltr with rtl and vice versa ONLY in the body direction.
+
+ Args:
+ line: A string to replace instances of ltr with rtl.
+ Returns:
+ line with direction: ltr and direction: rtl swapped only in body selector.
+ line = FixBodyDirectionLtrAndRtl('body { direction:ltr }')
+ line will now be 'body { direction:rtl }'.
+ """
+
+ line = BODY_DIRECTION_LTR_RE.sub('\\1\\2\\3%s' % TMP_TOKEN, line)
+ line = BODY_DIRECTION_RTL_RE.sub('\\1\\2\\3%s' % LTR, line)
+ line = line.replace(TMP_TOKEN, RTL)
+ logging.debug('FixBodyDirectionLtrAndRtl returns: %s' % line)
+ return line
+
+
+def FixLeftAndRight(line):
+ """Replaces left with right and vice versa in line.
+
+ Args:
+ line: A string in which to perform the replacement.
+
+ Returns:
+ line with left and right swapped. For example:
+ line = FixLeftAndRight('padding-left: 2px; margin-right: 1px;')
+ line will now be 'padding-right: 2px; margin-left: 1px;'.
+ """
+
+ line = LEFT_RE.sub(TMP_TOKEN, line)
+ line = RIGHT_RE.sub(LEFT, line)
+ line = line.replace(TMP_TOKEN, RIGHT)
+ logging.debug('FixLeftAndRight returns: %s' % line)
+ return line
+
+
+def FixLeftAndRightInUrl(line):
+ """Replaces left with right and vice versa ONLY within background urls.
+
+ Args:
+ line: A string in which to replace left with right and vice versa.
+
+ Returns:
+ line with left and right swapped in the url string. For example:
+ line = FixLeftAndRightInUrl('background:url(right.png)')
+ line will now be 'background:url(left.png)'.
+ """
+
+ line = LEFT_IN_URL_RE.sub(TMP_TOKEN, line)
+ line = RIGHT_IN_URL_RE.sub(LEFT, line)
+ line = line.replace(TMP_TOKEN, RIGHT)
+ logging.debug('FixLeftAndRightInUrl returns: %s' % line)
+ return line
+
+
+def FixLtrAndRtlInUrl(line):
+ """Replaces ltr with rtl and vice versa ONLY within background urls.
+
+ Args:
+ line: A string in which to replace ltr with rtl and vice versa.
+
+ Returns:
+ line with left and right swapped. For example:
+ line = FixLtrAndRtlInUrl('background:url(rtl.png)')
+ line will now be 'background:url(ltr.png)'.
+ """
+
+ line = LTR_IN_URL_RE.sub(TMP_TOKEN, line)
+ line = RTL_IN_URL_RE.sub(LTR, line)
+ line = line.replace(TMP_TOKEN, RTL)
+ logging.debug('FixLtrAndRtlInUrl returns: %s' % line)
+ return line
+
+
+def FixCursorProperties(line):
+ """Fixes directional CSS cursor properties.
+
+ Args:
+ line: A string to fix CSS cursor properties in.
+
+ Returns:
+ line reformatted with the cursor properties substituted. For example:
+ line = FixCursorProperties('cursor: ne-resize')
+ line will now be 'cursor: nw-resize'.
+ """
+
+ line = CURSOR_EAST_RE.sub('\\1' + TMP_TOKEN, line)
+ line = CURSOR_WEST_RE.sub('\\1e-resize', line)
+ line = line.replace(TMP_TOKEN, 'w-resize')
+ logging.debug('FixCursorProperties returns: %s' % line)
+ return line
+
+
+def FixFourPartNotation(line):
+ """Fixes the second and fourth positions in 4 part CSS notation.
+
+ Args:
+ line: A string to fix 4 part CSS notation in.
+
+ Returns:
+ line reformatted with the 4 part notations swapped. For example:
+ line = FixFourPartNotation('padding: 1px 2px 3px 4px')
+ line will now be 'padding: 1px 4px 3px 2px'.
+ """
+ line = FOUR_NOTATION_QUANTITY_RE.sub('\\1 \\4 \\3 \\2', line)
+ line = FOUR_NOTATION_COLOR_RE.sub('\\1\\2 \\5 \\4 \\3', line)
+ logging.debug('FixFourPartNotation returns: %s' % line)
+ return line
+
+
+def FixBackgroundPosition(line):
+ """Fixes horizontal background percentage values in line.
+
+ Args:
+ line: A string to fix horizontal background position values in.
+
+ Returns:
+ line reformatted with the 4 part notations swapped.
+ """
+ line = BG_HORIZONTAL_PERCENTAGE_RE.sub(CalculateNewBackgroundPosition, line)
+ line = BG_HORIZONTAL_PERCENTAGE_X_RE.sub(CalculateNewBackgroundPositionX,
+ line)
+ logging.debug('FixBackgroundPosition returns: %s' % line)
+ return line
+
+
+def CalculateNewBackgroundPosition(m):
+ """Fixes horizontal background-position percentages.
+
+ This function should be used as an argument to re.sub since it needs to
+ perform replacement specific calculations.
+
+ Args:
+ m: A match object.
+
+ Returns:
+ A string with the horizontal background position percentage fixed.
+ BG_HORIZONTAL_PERCENTAGE_RE.sub(FixBackgroundPosition,
+ 'background-position: 75% 50%')
+ will return 'background-position: 25% 50%'.
+ """
+
+ # The flipped value is the offset from 100%
+ new_x = str(100-int(m.group(4)))
+
+ # Since m.group(1) may very well be None type and we need a string..
+ if m.group(1):
+ position_string = m.group(1)
+ else:
+ position_string = ''
+
+ return 'background%s%s%s%s%%%s' % (position_string, m.group(2), m.group(3),
+ new_x, m.group(5))
+
+
+def CalculateNewBackgroundPositionX(m):
+ """Fixes percent based background-position-x.
+
+ This function should be used as an argument to re.sub since it needs to
+ perform replacement specific calculations.
+
+ Args:
+ m: A match object.
+
+ Returns:
+ A string with the background-position-x percentage fixed.
+ BG_HORIZONTAL_PERCENTAGE_X_RE.sub(CalculateNewBackgroundPosition,
+ 'background-position-x: 75%')
+ will return 'background-position-x: 25%'.
+ """
+
+ # The flipped value is the offset from 100%
+ new_x = str(100-int(m.group(2)))
+
+ return 'background-position-x%s%s%%' % (m.group(1), new_x)
+
+
+def ChangeLeftToRightToLeft(lines,
+ swap_ltr_rtl_in_url=None,
+ swap_left_right_in_url=None):
+ """Turns lines into a stream and runs the fixing functions against it.
+
+ Args:
+ lines: An list of CSS lines.
+ swap_ltr_rtl_in_url: Overrides this flag if param is set.
+ swap_left_right_in_url: Overrides this flag if param is set.
+
+ Returns:
+ The same lines, but with left and right fixes.
+ """
+
+ global FLAGS
+
+ # Possibly override flags with params.
+ logging.debug('ChangeLeftToRightToLeft swap_ltr_rtl_in_url=%s, '
+ 'swap_left_right_in_url=%s' % (swap_ltr_rtl_in_url,
+ swap_left_right_in_url))
+ if swap_ltr_rtl_in_url is None:
+ swap_ltr_rtl_in_url = FLAGS['swap_ltr_rtl_in_url']
+ if swap_left_right_in_url is None:
+ swap_left_right_in_url = FLAGS['swap_left_right_in_url']
+
+ # Turns the array of lines into a single line stream.
+ logging.debug('LINES COUNT: %s' % len(lines))
+ line = TOKEN_LINES.join(lines)
+
+ # Tokenize any single line rules with the /* noflip */ annotation.
+ noflip_single_tokenizer = Tokenizer(NOFLIP_SINGLE_RE, 'NOFLIP_SINGLE')
+ line = noflip_single_tokenizer.Tokenize(line)
+
+ # Tokenize any class rules with the /* noflip */ annotation.
+ noflip_class_tokenizer = Tokenizer(NOFLIP_CLASS_RE, 'NOFLIP_CLASS')
+ line = noflip_class_tokenizer.Tokenize(line)
+
+ # Tokenize the comments so we can preserve them through the changes.
+ comment_tokenizer = Tokenizer(COMMENT_RE, 'C')
+ line = comment_tokenizer.Tokenize(line)
+
+ # Here starteth the various left/right orientation fixes.
+ line = FixBodyDirectionLtrAndRtl(line)
+
+ if swap_left_right_in_url:
+ line = FixLeftAndRightInUrl(line)
+
+ if swap_ltr_rtl_in_url:
+ line = FixLtrAndRtlInUrl(line)
+
+ line = FixLeftAndRight(line)
+ line = FixCursorProperties(line)
+ line = FixFourPartNotation(line)
+ line = FixBackgroundPosition(line)
+
+ # DeTokenize the single line noflips.
+ line = noflip_single_tokenizer.DeTokenize(line)
+
+ # DeTokenize the class-level noflips.
+ line = noflip_class_tokenizer.DeTokenize(line)
+
+ # DeTokenize the comments.
+ line = comment_tokenizer.DeTokenize(line)
+
+ # Rejoin the lines back together.
+ lines = line.split(TOKEN_LINES)
+
+ return lines
+
+def usage():
+ """Prints out usage information."""
+
+ print 'Usage:'
+ print ' ./cssjanus.py < file.css > file-rtl.css'
+ print 'Flags:'
+ print ' --swap_left_right_in_url: Fixes "left"/"right" string within urls.'
+ print ' Ex: ./cssjanus.py --swap_left_right_in_url < file.css > file_rtl.css'
+ print ' --swap_ltr_rtl_in_url: Fixes "ltr"/"rtl" string within urls.'
+ print ' Ex: ./cssjanus --swap_ltr_rtl_in_url < file.css > file_rtl.css'
+
+def setflags(opts):
+ """Parse the passed in command line arguments and set the FLAGS global.
+
+ Args:
+ opts: getopt iterable intercepted from argv.
+ """
+
+ global FLAGS
+
+ # Parse the arguments.
+ for opt, arg in opts:
+ logging.debug('opt: %s, arg: %s' % (opt, arg))
+ if opt in ("-h", "--help"):
+ usage()
+ sys.exit()
+ elif opt in ("-d", "--debug"):
+ logging.getLogger().setLevel(logging.DEBUG)
+ elif opt == '--swap_ltr_rtl_in_url':
+ FLAGS['swap_ltr_rtl_in_url'] = True
+ elif opt == '--swap_left_right_in_url':
+ FLAGS['swap_left_right_in_url'] = True
+
+
+def main(argv):
+ """Sends stdin lines to ChangeLeftToRightToLeft and writes to stdout."""
+
+ # Define the flags.
+ try:
+ opts, args = getopt.getopt(argv, 'hd', ['help', 'debug',
+ 'swap_left_right_in_url',
+ 'swap_ltr_rtl_in_url'])
+ except getopt.GetoptError:
+ usage()
+ sys.exit(2)
+
+ # Parse and set the flags.
+ setflags(opts)
+
+ # Call the main routine with all our functionality.
+ fixed_lines = ChangeLeftToRightToLeft(sys.stdin.readlines())
+ sys.stdout.write(''.join(fixed_lines))
+
+if __name__ == '__main__':
+ main(sys.argv[1:])
--- /dev/null
+#!/usr/bin/python
+#
+# Copyright 2007 Google Inc. All Rights Reserved.
+
+"""CSS Lexical Grammar rules.
+
+CSS lexical grammar from http://www.w3.org/TR/CSS21/grammar.html
+"""
+
+__author__ = ['elsigh@google.com (Lindsey Simon)',
+ 'msamuel@google.com (Mike Samuel)']
+
+# public symbols
+__all__ = [ "NEWLINE", "HEX", "NON_ASCII", "UNICODE", "ESCAPE", "NMSTART", "NMCHAR", "STRING1", "STRING2", "IDENT", "NAME", "HASH", "NUM", "STRING", "URL", "SPACE", "WHITESPACE", "COMMENT", "QUANTITY", "PUNC" ]
+
+# The comments below are mostly copied verbatim from the grammar.
+
+# "@import" {return IMPORT_SYM;}
+# "@page" {return PAGE_SYM;}
+# "@media" {return MEDIA_SYM;}
+# "@charset" {return CHARSET_SYM;}
+KEYWORD = r'(?:\@(?:import|page|media|charset))'
+
+# nl \n|\r\n|\r|\f ; a newline
+NEWLINE = r'\n|\r\n|\r|\f'
+
+# h [0-9a-f] ; a hexadecimal digit
+HEX = r'[0-9a-f]'
+
+# nonascii [\200-\377]
+NON_ASCII = r'[\200-\377]'
+
+# unicode \\{h}{1,6}(\r\n|[ \t\r\n\f])?
+UNICODE = r'(?:(?:\\' + HEX + r'{1,6})(?:\r\n|[ \t\r\n\f])?)'
+
+# escape {unicode}|\\[^\r\n\f0-9a-f]
+ESCAPE = r'(?:' + UNICODE + r'|\\[^\r\n\f0-9a-f])'
+
+# nmstart [_a-z]|{nonascii}|{escape}
+NMSTART = r'(?:[_a-z]|' + NON_ASCII + r'|' + ESCAPE + r')'
+
+# nmchar [_a-z0-9-]|{nonascii}|{escape}
+NMCHAR = r'(?:[_a-z0-9-]|' + NON_ASCII + r'|' + ESCAPE + r')'
+
+# ident -?{nmstart}{nmchar}*
+IDENT = r'-?' + NMSTART + NMCHAR + '*'
+
+# name {nmchar}+
+NAME = NMCHAR + r'+'
+
+# hash
+HASH = r'#' + NAME
+
+# string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\" ; "string"
+STRING1 = r'"(?:[^\"\\]|\\.)*"'
+
+# string2 \'([^\n\r\f\\']|\\{nl}|{escape})*\' ; 'string'
+STRING2 = r"'(?:[^\'\\]|\\.)*'"
+
+# string {string1}|{string2}
+STRING = '(?:' + STRING1 + r'|' + STRING2 + ')'
+
+# num [0-9]+|[0-9]*"."[0-9]+
+NUM = r'(?:[0-9]*\.[0-9]+|[0-9]+)'
+
+# s [ \t\r\n\f]
+SPACE = r'[ \t\r\n\f]'
+
+# w {s}*
+WHITESPACE = '(?:' + SPACE + r'*)'
+
+# url special chars
+URL_SPECIAL_CHARS = r'[!#$%&*-~]'
+
+# url chars ({url_special_chars}|{nonascii}|{escape})*
+URL_CHARS = r'(?:%s|%s|%s)*' % (URL_SPECIAL_CHARS, NON_ASCII, ESCAPE)
+
+# url
+URL = r'url\(%s(%s|%s)%s\)' % (WHITESPACE, STRING, URL_CHARS, WHITESPACE)
+
+# comments
+# see http://www.w3.org/TR/CSS21/grammar.html
+COMMENT = r'/\*[^*]*\*+([^/*][^*]*\*+)*/'
+
+# {E}{M} {return EMS;}
+# {E}{X} {return EXS;}
+# {P}{X} {return LENGTH;}
+# {C}{M} {return LENGTH;}
+# {M}{M} {return LENGTH;}
+# {I}{N} {return LENGTH;}
+# {P}{T} {return LENGTH;}
+# {P}{C} {return LENGTH;}
+# {D}{E}{G} {return ANGLE;}
+# {R}{A}{D} {return ANGLE;}
+# {G}{R}{A}{D} {return ANGLE;}
+# {M}{S} {return TIME;}
+# {S} {return TIME;}
+# {H}{Z} {return FREQ;}
+# {K}{H}{Z} {return FREQ;}
+# % {return PERCENTAGE;}
+UNIT = r'(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)'
+
+# {num}{UNIT|IDENT} {return NUMBER;}
+QUANTITY = '%s(?:%s%s|%s)?' % (NUM, WHITESPACE, UNIT, IDENT)
+
+# "<!--" {return CDO;}
+# "-->" {return CDC;}
+# "~=" {return INCLUDES;}
+# "|=" {return DASHMATCH;}
+# {w}"{" {return LBRACE;}
+# {w}"+" {return PLUS;}
+# {w}">" {return GREATER;}
+# {w}"," {return COMMA;}
+PUNC = r'<!--|-->|~=|\|=|[\{\+>,:;]'
--- /dev/null
+/* Babaco Color Scheme A */
+
+
+a:visited,
+a:visited div.vectorTabs li.selected a:visited span {
+ color: #260e9c;
+}
+
+html .thumbimage,
+#toc, .toc, .mw-warning, div.thumbinner {
+ border-color: #cccccc;
+ background-color: #f7f7f7;
+}
+
+/* Framework */
+#mw-page-base {
+ background-color: inherit !important;
+ background-image: none !important;
+}
+body {
+ background-color: #f9f9f9 !important;
+ background-image:url(images/page-base-updated.png);
+}
+
+/* Links */
+a {
+ color: #0066cc;
+}
+a:visited {
+ color: #004d99;
+}
+a:active {
+ color: #ff6600;
+}
+a.stub {
+ color: #56228b;
+}
+a.new, #p-personal a.new {
+ color: #a31205 !important;
+}
+a.new:visited, #p-personal a.new:visited {
+ color: #a31205;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ border-color:#999999;
+ font-family:georgia, times, serif;
+ font-weight:bold;
+}
+#firstHeading {
+ font-size:1.5em;
+}
+h2 .editsection,
+.portal h5{
+ font-family:sans-serif;
+ font-weight:normal;
+
+}
+#toc h2, .toc h2 {
+ font-family:sans-serif;
+ font-weight:normal;
+}
+body #mw-panel div.portal div.body {
+ background-image:url(images/new-portal-break-ltr.png);
+}
+body.rtl #mw-panel div.portal div.body {
+ background-image:url(images/new-portal-break-rtl.png);
+}
+body div.vectorTabs li a, div.vectorTabs li a span{
+ color:#4d4d4d;
+}
+body div.vectorTabs li.selected a,
+body div.vectorTabs li.selected a span,
+body div.vectorTabs li.selected a:visited
+body div.vectorTabs li.selected a:visited span {
+ color: #ff9900 !important;
+ font-weight:bold;
+}
+div.vectorTabs li.new a,
+div.vectorTabs li.new a span,
+div.vectorTabs li.new a:visited,
+div.vectorTabs li.new a:visited span {
+ color:#a31205;
+}
+#toc,
+.toc,
+.mw-warning,
+div.gallerybox div.thumb,
+table.gallery,
+#preferences fieldset.prefsection fieldset,
+#preferences,
+html .thumbimage,
+.usermessage,
+img.thumbborder,
+div.thumbinner{
+ border: 1px solid #cccccc;
+ background-color: #f7f7f7;
+}
+#mw-panel div.portal h5 {
+ font-weight:bold;
+ margin-bottom:0;
+ padding-bottom:0.05em;
+ color:#000000;
+}
--- /dev/null
+/* Babaco Color Scheme A */
+
+
+html .thumbimage,
+#toc, .toc, .mw-warning, div.thumbinner {
+ border-color: #cccccc;
+ background-color: #f7f7f7;
+}
+
+/* Framework */
+#mw-page-base {
+ background-color: inherit !important;
+ background-image: none !important;
+}
+body {
+ background-color: #f9f9f9 !important;
+ background-image:url(images/page-base-updated.png);
+}
+/* Links */
+a {
+ color: #003cb3;
+}
+a.stub {
+ color: #772233;
+}
+a.new, #p-personal a.new {
+ color: #a31205 !important;
+}
+{
+ color: #260e9c;
+}
+a:visited,
+a:visited div.vectorTabs li.selected a:visited span,
+a.new:visited,
+#p-personal a.new:visited {
+ color: #260e9c;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ border-color:#999999;
+}
+
+div.vectorTabs li.new a,
+div.vectorTabs li.new a span,
+div.vectorTabs li.new a:visited,
+div.vectorTabs li.new a:visited span {
+ color:#a31205;
+}
+
+#toc,
+.toc,
+.mw-warning,
+div.gallerybox div.thumb,
+table.gallery,
+#preferences fieldset.prefsection fieldset,
+#preferences,
+html .thumbimage,
+.usermessage,
+img.thumbborder,
+div.thumbinner{
+ border: 1px solid #cccccc;
+ background-color: #f7f7f7;
+}
--- /dev/null
+/* Babaco Color Scheme C */
+
+/* ridding ourselves of the gradient */
+#mw-page-base {
+ background-color: inherit !important;
+ background-image: none !important;
+}
+
+a:visited,
+a:visited div.vectorTabs li.selected a:visited span {
+ color: #260e9c;
+}
+
+html .thumbimage,
+#toc, .toc, .mw-warning, div.thumbinner {
+ border-color: #cccccc;
+ background-color: #f7f7f7;
+}
+
+/* Framework */
+body {
+ background-color: #f9f9f9 !important;
+ background-image:url(images/page-base-updated.png);
+}
+
+/* Links */
+a {
+ color: #0066cc;
+}
+a:visited {
+ color: #004d99;
+}
+a:active {
+ color: #ff6600;
+}
+a.stub {
+ color: #56228b;
+}
+a.new, #p-personal a.new {
+ color: #a31205 !important;
+}
+a.new:visited, #p-personal a.new:visited {
+ color: #a31205;
+}
+
+#firstHeading {
+ font-size:1.5em;
+}
+h2 .editsection,
+.portal h5 {
+ font-weight:normal;
+}
+#toc h2, .toc h2 {
+ font-weight:normal;
+}
+body #mw-panel div.portal div.body {
+ background-image:url(images/new-portal-break-ltr.png);
+}
+
+div.vectorTabs li.new a,
+div.vectorTabs li.new a span,
+div.vectorTabs li.new a:visited,
+div.vectorTabs li.new a:visited span {
+ color:#a31205;
+}
+#toc,
+.toc,
+.mw-warning,
+div.gallerybox div.thumb,
+table.gallery,
+#preferences fieldset.prefsection fieldset,
+#preferences,
+html .thumbimage,
+.usermessage,
+img.thumbborder,
+div.thumbinner {
+ border: 1px solid #cccccc;
+ background-color: #f7f7f7;
+}
+#mw-panel div.portal h5 {
+ font-weight:bold;
+ margin-bottom:0;
+ padding-bottom:0.05em;
+ color:#000000;
+}
+div.vectorTabs li.selected a,
+div.vectorTabs li.selected a span,
+div.vectorTabs li.selected a:visited
+div.vectorTabs li.selected a:visited span {
+ color: #333333 !important;
+}
\ No newline at end of file
--- /dev/null
+/* new border color */
+#content {
+ background-image: url(images/new-border.png);
+}
+
+#footer {
+ background-image: url(images/new-border.png);
+}
+ body div#left-navigation,
+ body div#right-navigation {
+ top:3.2em;
+ }
+ body div#right-navigation {
+ margin-top:3.2em;
+ }
+ body #p-search form,
+ body #p-search input,
+ body #simpleSearch {
+ margin-top:0;
+ }
+ body div#p-cactions {
+ margin-top:0;
+ }
+ /* Namespaces and Views */
+ /* @noflip */
+ div.vectorTabs {
+ float: left;
+ }
+ body div.vectorTabs {
+ background-image: none;
+ padding-left: 0;
+ }
+ /* @noflip */
+ div.vectorTabs ul {
+ float: left;
+ }
+ div.vectorTabs ul {
+ height: 100%;
+ list-style: none;
+ background-image:none;
+ margin: 0;
+ padding: 0;
+ }
+ /* @noflip */
+ div.vectorTabs ul li {
+ float: left;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ body div.vectorTabs ul li {
+ line-height: 1em;
+ display: inline-block;
+ height: 2em;
+ margin: 0 1px 0 0;
+ padding: 0;
+ background:none;
+ overflow:hidden;
+ white-space:nowrap;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorTabs ul > li {
+ display: block;
+ }
+ body div.vectorTabs li.selected {
+ background-image: none;
+ border:none;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ body div.vectorTabs li a {
+ border-top:1px solid #cccccc;
+ border-left:1px solid #cccccc;
+ border-right:1px solid #cccccc;
+ display: inline-block;
+ height: 1.7em;
+ padding-left: 0.6em;
+ padding-right: 0.6em;
+ background-image:url(images/tab-fade.png);
+ background-position:bottom left;
+ background-repeat:repeat-x;
+ background-color:#ffffff;
+ }
+ body div.vectorTabs li.new a{
+ background-image:url(images/tab-new-fade.png);
+
+ }
+ div.vectorTabs li a,
+ div.vectorTabs li a span {
+ cursor: pointer;
+ }
+ div.vectorTabs li a span {
+ font-size: 0.8em;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorTabs li > a {
+ display: block;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ body div.vectorTabs a span {
+ display: inline-block;
+ padding-top: 0.5em;
+ }
+ /* IGNORED BY IE6 */
+ /* @noflip */
+ div.vectorTabs a > span {
+ float: left;
+ display: block;
+ }
+ body div.vectorTabs li.last {
+ background-image: url(images/tab-last.png);
+ background-repeat:no-repeat;
+ background-position:top right;
+ border:none;
+ }
+ body div.vectorTabs li.last a {
+ margin-right:7px;
+ padding-left:0.4em;
+ padding-right:0;
+ border-left:1px solid #cccccc;
+ border-top:1px solid #cccccc;
+ border-right:none;
+ background-image:url(images/tab-fade.png);
+ background-position:top left;
+ background-repeat:repeat-x;
+ }
+ body div.vectorTabs li.first {
+ background-image: url(images/tab-first.png);
+ background-repeat:no-repeat;
+ background-position:top left;
+ border:none;
+ }
+ body div.vectorTabs li.first a {
+ margin-left:7px;
+ padding-left:0em;
+ padding-right:0.4em;
+ border-right:1px solid #cccccc;
+ border-top:1px solid #cccccc;
+ background-image:url(images/tab-fade.png);
+ background-position:top left;
+ background-repeat:repeat-x;
+ }
+
+ div.vectorTabs li.selected a,
+ div.vectorTabs li.selected a span,
+ div.vectorTabs li.selected a:visited
+ div.vectorTabs li.selected a:visited span {
+ color: #be5900 !important;
+ text-decoration: none;
+ }
+
+ body div.vectorTabs li.selected a {
+ border-top:1px solid #6cc8f3;
+ border-right:1px solid #6cc8f3;
+ border-left:1px solid #6cc8f3;
+ background-color:#fff;
+ height:1.75em;
+ background-image:none;
+ }
+ body div.vectorTabs li.selected.first {
+ background-image: url(images/tab-active-first.png);
+ background-repeat:no-repeat;
+ background-position:top left;
+ }
+ body div.vectorTabs li.selected.first a {
+ margin-left:7px;
+ padding-right:0.6em;
+ padding-left:0.4em;
+ border-left:none;
+ }
+ body div.vectorTabs li.selected.last {
+ background-image: url(images/tab-active-last.png);
+ background-repeat:no-repeat;
+ background-position:top right;
+ }
+ body div.vectorTabs li.selected.last a {
+ margin-right:7px;
+ padding-left:0.6em;
+ padding-right:0.4em;
+ border-right:none;
+ }
+
+ /* Variants and Actions */
+ /* @noflip */
+ div.vectorMenu {
+ background-image:url(images/tab-fade.png);
+ background-position:bottom left;
+ background-repeat:repeat-x;
+ border-top:1px solid #cccccc;
+ border-left:1px solid #cccccc;
+ border-right:1px solid #cccccc;
+ }
+ body.rtl div.vectorMenu {
+ direction: rtl;
+ }
+ /* @noflip */
+ body #mw-head div.vectorMenu h5 {
+ background-image: url(../images/arrow-down-icon.png);
+ background-position: center center;
+ background-repeat: no-repeat;
+ padding-left: 0;
+ margin-left: 0px;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ body div.vectorMenu h5 a {
+ display: inline-block;
+ width: 24px;
+ height:1.5em;
+ background-image: none !important;
+
+ }
+ /* IGNORED BY IE6 */
+ div.vectorMenu h5 > a {
+ display: block;
+ }
+ div.vectorMenu div.menu {
+ position: relative;
+ left:1px;
+ display: none;
+ clear: both;
+ text-align: left;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ body.rtl div.vectorMenu div.menu {
+ margin-right: 24px;
+ }
+ /* IGNORED BY IE6 */
+ body.rtl div.vectorMenu > div.menu {
+ margin-right: auto;
+ }
+ /* Fixes old versions of FireFox */
+ body.rtl div.vectorMenu > div.menu,
+ x:-moz-any-link {
+ margin-right: 24px;
+ }
+ div.vectorMenu:hover div.menu {
+ display: block;
+ }
+ div.vectorMenu ul {
+ position: absolute;
+ background-color: white;
+ border: solid 1px silver;
+ border-top-width: 0;
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ margin-left: -1px;
+ text-align: left;
+ }
+ /* Fixes old versions of FireFox */
+ div.vectorMenu ul,
+ x:-moz-any-link {
+ min-width: 5em;
+ }
+ /* Returns things back to normal in modern versions of FireFox */
+ div.vectorMenu ul,
+ x:-moz-any-link,
+ x:default {
+ min-width: 0;
+ }
+ div.vectorMenu li {
+ padding: 0;
+ margin: 0;
+ text-align: left;
+ line-height: 1em;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorMenu li a {
+ display: inline-block;
+ padding: 0.5em;
+ white-space: nowrap;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorMenu li > a {
+ display: block;
+ }
+ div.vectorMenu li a {
+ color: #0645ad;
+ cursor: pointer;
+ font-size: 0.8em;
+ }
+ div.vectorMenu li.selected a,
+ div.vectorMenu li.selected a:visited {
+ color: #333333;
+ text-decoration: none;
+ }
+#ca-unwatch.icon,
+#ca-watch.icon {
+ background-color:#ffffff;
+ height:1.75em !important;
+ background-image:url(images/tab-fade.png);
+ background-position:bottom left;
+ background-repeat:repeat-x;
+}
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+ height: 1.7em !important;
+ border-bottom:none;
+ background-color:transparent;
+}
+#ca-watch.icon a,
+#ca-unwatch.icon a {
+ background-repeat:no-repeat;
+}
+.wikiEditor-ui-tabs {
+ border: none;
+ height: 2.15em;
+}
+.wikiEditor-ui-buttons {
+ height: 2.15em;
+}
+.wikiEditor-ui-tabs div {
+ border: 1px solid silver;
+ margin-right: 1px;
+ height: 2.15em;
+}
+.wikiEditor-ui-tabs div a {
+ line-height: 2.15em;
+ background: #FFFFFF url(images/tab-fade.png) repeat-x 0 100%;
+}
+.wikiEditor-ui-tabs div.current a {
+ background: #FFFFFF;
+}
--- /dev/null
+/*
+ * main-rtl.css is automatically generated using CSSJanus, a python script for
+ * creating RTL versions of otherwise LTR stylesheets.
+ *
+ * You may download the tool to rebuild this stylesheet
+ * http://code.google.com/p/cssjanus/
+ *
+ * An online version of this tool can be used at:
+ * http://cssjanus.commoner.com/
+ *
+ * The following command is used to generate the RTL version of this file
+ * ./cssjanus.py --swap_ltr_rtl_in_url < main-ltr.css > main-rtl.css
+ *
+ * Any rules which should not be flipped should be prepended with @noflip in
+ * a comment block.
+ */
+/* Framework */
+html,
+body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+body {
+ /*background-color: #f3f3f3;*/
+ /*background-color: #b7c8b7;*/
+ /*background-image: url(images/page-base.png);*/
+
+ /* thanks to http://blog.fakedarren.com/2010/01/cross-browser-css-gradients/ */
+ /* and http://www.puremango.co.uk/2010/04/css-gradient/ */
+ /* fallback (Opera) */
+ background: #b7c8b7;
+ /* Mozilla: */
+ background: -moz-linear-gradient(top, #b7c8b7, #e7f8e7);
+ /* Chrome, Safari:*/
+ background: -webkit-gradient(linear,
+ left top, left bottom, from(#b7c8b7), to(#e7f8e7));
+ /* MSIE */
+ filter: progid:DXImageTransform.Microsoft.Gradient(
+ StartColorStr='#b7c8b7', EndColorStr='#e7f8e7', GradientType=0);
+}
+
+/* Content */
+#content {
+ margin-left: 10em;
+ padding: 1em;
+ background-image: url(images/border.png);
+ background-position: top left;
+ background-repeat: repeat-y;
+ /* fallback (Opera) */
+ background: white;
+ /* Mozilla: */
+ background: -moz-linear-gradient(top, white, #c7b3cc);
+ /* Chrome, Safari:*/
+ background: -webkit-gradient(linear,
+ left top, left bottom, from(white), to(#c7b3cc));
+ /* MSIE */
+ filter: progid:DXImageTransform.Microsoft.Gradient(
+ StartColorStr='white', EndColorStr='#c7b3cc', GradientType=0);
+ /*background-color: white;*/
+}
+/* Head */
+#mw-page-base {
+ height: 5em;
+ /*background-color: grey;*/
+ background-image: url(images/page-fade.png);
+ opacity: 0.0;
+ background-position: bottom left;
+ background-repeat: repeat-x;
+}
+#mw-head-base {
+ margin-top: -5em;
+ margin-left: 10em;
+ height: 5em;
+ background-image: url(images/border.png);
+ background-position: bottom left;
+ background-repeat: repeat-x;
+}
+#mw-head {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 100%;
+}
+#mw-head h5 {
+ margin: 0;
+ padding: 0;
+}
+ /* Hide empty portlets */
+ div.emptyPortlet {
+ display: none;
+ }
+ /* Personal */
+ #p-personal {
+ position: absolute;
+ top: 0;
+ margin-left: 10em;
+ right: 0.75em;
+ }
+ #p-personal h5 {
+ display: none;
+ }
+ #p-personal ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+ /* @noflip */
+ #p-personal li {
+ line-height: 1.125em;
+ float: left;
+ }
+ #p-personal li {
+ margin-left: 0.75em;
+ margin-top: 0.5em;
+ font-size: 0.75em;
+ }
+ /* Navigation Containers */
+ #left-navigation {
+ position: absolute;
+ left: 10em;
+ top: 2.5em;
+ }
+ #right-navigation {
+ float: right;
+ margin-top: 2.5em;
+ }
+ /* Navigation Labels */
+ div.vectorTabs h5,
+ div.vectorMenu h5 span {
+ display: none;
+ }
+ /* Namespaces and Views */
+ /* @noflip */
+ div.vectorTabs {
+ float: left;
+ }
+ div.vectorTabs {
+ background-image: url(images/tab-break.png);
+ background-position: bottom left;
+ background-repeat: no-repeat;
+ padding-left: 1px;
+ }
+ /* @noflip */
+ div.vectorTabs ul {
+ float: left;
+ }
+ div.vectorTabs ul {
+ height: 100%;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+ /* @noflip */
+ div.vectorTabs ul li {
+ float: left;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorTabs ul li {
+ line-height: 1.125em;
+ display: inline-block;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+
+ /* thanks to http://blog.fakedarren.com/2010/01/cross-browser-css-gradients/ */
+ /* and http://www.puremango.co.uk/2010/04/css-gradient/ */
+ /* fallback (Opera) */
+ background: #b7c8b7;
+ /* Mozilla: */
+ background: -moz-linear-gradient(top, #b7c8b7, #aaaaaa);
+ /* Chrome, Safari:*/
+ background: -webkit-gradient(linear,
+ left top, left bottom, from(#b7c8b7), to(#aaaaaa));
+ /* MSIE */
+ filter: progid:DXImageTransform.Microsoft.Gradient(
+ StartColorStr='#b7c8b7', EndColorStr='#aaaaaa', GradientType=0);
+
+ /*background-color: #f3f3f3;*/
+ /*background-color: #b7c8b7;*/
+ /*background-image: url(images/tab-normal-fade.png);*/
+ background-position: bottom left;
+ background-repeat: repeat-x;
+ white-space:nowrap;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorTabs ul > li {
+ display: block;
+ }
+ div.vectorTabs li.selected {
+
+ /* thanks to http://blog.fakedarren.com/2010/01/cross-browser-css-gradients/ */
+ /* and http://www.puremango.co.uk/2010/04/css-gradient/ */
+ /* fallback (Opera) */
+ background: #b7c8b7;
+ /* Mozilla: */
+ background: -moz-linear-gradient(top, #b7c8b7, white);
+ /* Chrome, Safari:*/
+ background: -webkit-gradient(linear,
+ left top, left bottom, from(#b7c8b7), to(white));
+ /* MSIE */
+ filter: progid:DXImageTransform.Microsoft.Gradient(
+ StartColorStr='#b7c8b7', EndColorStr='white', GradientType=0);
+
+ /*background-image: url(images/tab-current-fade.png);*/
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorTabs li a {
+ display: inline-block;
+ height: 2.5em;
+ padding-left: 0.4em;
+ padding-right: 0.4em;
+ background-image: url(images/tab-break.png);
+ background-position: bottom right;
+ background-repeat: no-repeat;
+ }
+ div.vectorTabs li a,
+ div.vectorTabs li a span {
+ /*color: #0645ad;*/
+ color: #67536c;
+ cursor: pointer;
+ }
+ div.vectorTabs li a span {
+ font-size: 0.8em;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorTabs li > a {
+ display: block;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorTabs a span {
+ display: inline-block;
+ padding-top: 1.25em;
+ }
+ /* IGNORED BY IE6 */
+ /* @noflip */
+ div.vectorTabs a > span {
+ float: left;
+ display: block;
+ }
+ div.vectorTabs li.selected a,
+ div.vectorTabs li.selected a span,
+ div.vectorTabs li.selected a:visited
+ div.vectorTabs li.selected a:visited span {
+ color: #333333;
+ text-decoration: none;
+ }
+ div.vectorTabs li.new a,
+ div.vectorTabs li.new a span,
+ div.vectorTabs li.new a:visited,
+ div.vectorTabs li.new a:visited span {
+ color: #a55858;
+ }
+ /* Variants and Actions */
+ /* @noflip */
+ div.vectorMenu {
+ direction: ltr;
+ float: left;
+ background-image: url(images/arrow-down-icon.png);
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+ /* @noflip */
+ body.rtl div.vectorMenu {
+ direction: rtl;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ /* @noflip */
+ #mw-head div.vectorMenu h5 {
+ float: left;
+ background-image: url(images/tab-break.png);
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #mw-head div.vectorMenu > h5 {
+ background-image: none;
+ }
+ #mw-head div.vectorMenu h5 {
+ background-position: bottom left;
+ margin-left: -1px;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ /* @noflip */
+ div.vectorMenu h5 a {
+ display: inline-block;
+ width: 24px;
+ height: 2.5em;
+ text-decoration: none;
+ background-image: url(images/tab-break.png);
+ background-repeat: no-repeat;
+ }
+ div.vectorMenu h5 a{
+ background-position: bottom right;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorMenu h5 > a {
+ display: block;
+ }
+ div.vectorMenu div.menu {
+ position: relative;
+ display: none;
+ clear: both;
+ text-align: left;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ /* @noflip */
+ body.rtl div.vectorMenu div.menu {
+ margin-left: 24px;
+ }
+ /* IGNORED BY IE6 */
+ /* @noflip */
+ body.rtl div.vectorMenu > div.menu {
+ margin-left: auto;
+ }
+ /* Fixes old versions of FireFox */
+ /* @noflip */
+ body.rtl div.vectorMenu > div.menu,
+ x:-moz-any-link {
+ margin-left: 23px;
+ }
+ div.vectorMenu:hover div.menu {
+ display: block;
+ }
+ div.vectorMenu ul {
+ position: absolute;
+
+ /* thanks to http://blog.fakedarren.com/2010/01/cross-browser-css-gradients/ */
+ /* and http://www.puremango.co.uk/2010/04/css-gradient/ */
+ /* fallback (Opera) */
+ background: white;
+ /* Mozilla: */
+ background: -moz-linear-gradient(top, white, #b7c8b7);
+ /* Chrome, Safari:*/
+ background: -webkit-gradient(linear,
+ left top, left bottom, from(white), to(#b7c8b7));
+ /* MSIE */
+ filter: progid:DXImageTransform.Microsoft.Gradient(
+ StartColorStr='white', EndColorStr='#b7c8b7', GradientType=0);
+
+ /*background-color: white;*/
+ border: solid 1px silver;
+ border-top-width: 0;
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ margin-left: -1px;
+ text-align: left;
+ }
+ /* Fixes old versions of FireFox */
+ div.vectorMenu ul,
+ x:-moz-any-link {
+ min-width: 5em;
+ }
+ /* Returns things back to normal in modern versions of FireFox */
+ div.vectorMenu ul,
+ x:-moz-any-link,
+ x:default {
+ min-width: 0;
+ }
+ div.vectorMenu li {
+ padding: 0;
+ margin: 0;
+ text-align: left;
+ line-height: 1em;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorMenu li a {
+ display: inline-block;
+ padding: 0.5em;
+ white-space: nowrap;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorMenu li > a {
+ display: block;
+ }
+ div.vectorMenu li a {
+ color: #0645ad;
+ cursor: pointer;
+ font-size: 0.8em;
+ }
+ div.vectorMenu li.selected a,
+ div.vectorMenu li.selected a:visited {
+ color: #333333;
+ text-decoration: none;
+ }
+ /* Search */
+ #p-search h5 {
+ display: none;
+ }
+ /* @noflip */
+ #p-search {
+ float: left;
+ }
+ #p-search {
+ margin-right: 0.5em;
+ margin-left: 0.5em;
+ }
+ #p-search form,
+ #p-search input {
+ margin: 0;
+ margin-top: 0.4em;
+ }
+ #simpleSearch {
+ margin-top: 0.5em;
+ position: relative;
+ border: solid 1px #AAAAAA;
+ background-color: white;
+ background-image: url(images/search-fade.png);
+ background-position: top left;
+ background-repeat: repeat-x;
+ }
+ #simpleSearch label {
+ font-size: 0.8em;
+ top: 0.25em;
+ }
+ #simpleSearch input#searchInput {
+ margin: 0;
+ border-width: 0;
+ padding: 0.25em;
+ line-height: 1em;
+ font-size: 0.8em;
+ width: 9em;
+ background-color: transparent;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ #simpleSearch button#searchButton {
+ margin: 0;
+ padding: 0;
+ width: 1.75em;
+ height: 1.5em;
+ border: none;
+ cursor: pointer;
+ background-color: transparent;
+ background-image: url(images/search-ltr.png);
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #simpleSearch > button#searchButton {
+ height: 100%;
+ }
+ .suggestions-special .special-label {
+ font-size: 0.8em;
+ color: gray;
+ }
+ .suggestions-special .special-query {
+ color: black;
+ font-style: italic;
+ }
+ .suggestions-special .special-hover {
+ background-color: silver;
+ }
+/* Panel */
+#mw-panel {
+ position: absolute;
+ top: 160px;
+ padding-top: 1em;
+ width: 10em;
+ left: 0;
+}
+ #mw-panel div.portal {
+ padding-bottom: 1.5em;
+ }
+ #mw-panel div.portal h5 {
+ font-weight: normal;
+ color: #444444;
+ padding: 0.25em;
+ padding-top: 0;
+ padding-left: 1.75em;
+ cursor: default;
+ border: none;
+ font-size: 0.75em;
+ }
+ #mw-panel div.portal div.body {
+ margin: 0;
+ padding-top: 0.5em;
+ margin-left: 1.25em;
+ background-image: url(images/portal-break.png);
+ background-repeat: no-repeat;
+ background-position: top left;
+ }
+ #mw-panel div.portal div.body ul {
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ }
+ #mw-panel div.portal div.body ul li {
+ line-height: 1.125em;
+ padding: 0;
+ padding-bottom: 0.5em;
+ margin: 0;
+ overflow: hidden;
+ font-size: 0.75em;
+ }
+ #mw-panel div.portal div.body ul li a {
+ color: #0645ad;
+ }
+ #mw-panel div.portal div.body ul li a:visited {
+ color: #0b0080;
+ }
+/* Footer */
+#footer {
+ margin-left: 10em;
+ margin-top: 0;
+ padding: 0.75em;
+ background-image: url(images/border.png);
+ background-position: top left;
+ background-repeat: repeat-x;
+}
+#footer ul {
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+#footer ul li {
+ margin: 0;
+ padding: 0;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ color: #333333;
+ font-size: 0.7em;
+}
+#footer #footer-icons {
+ float: right;
+}
+/* @noflip */
+body.ltr #footer #footer-places {
+ float: left;
+}
+#footer #footer-info li {
+ line-height: 1.4em;
+}
+#footer #footer-icons li {
+ float: left;
+ margin-left: 0.5em;
+ line-height: 2em;
+}
+#footer #footer-places li {
+ float: left;
+ margin-right: 1em;
+ line-height: 2em;
+}
+/* Logo */
+#p-logo {
+ position: absolute;
+ top: -160px;
+ left: 0;
+ width: 10em;
+ height: 160px;
+}
+#p-logo a {
+ display: block;
+ width: 10em;
+ height: 160px;
+ background-repeat: no-repeat;
+ background-position: center center;
+ text-decoration: none;
+}
+
+/*
+ *
+ * The following code is highly modified from monobook. It would be nice if the
+ * preftoc id was more human readable like preferences-toc for instance,
+ * howerver this would require backporting the other skins.
+ */
+
+/* Preferences */
+#preftoc {
+ /* Tabs */
+ width: 100%;
+ float: left;
+ clear: both;
+ margin: 0 !important;
+ padding: 0 !important;
+ background-image: url(images/preferences-break.png);
+ background-position: bottom left;
+ background-repeat: no-repeat;
+}
+ #preftoc li {
+ /* Tab */
+ float: left;
+ margin: 0;
+ padding: 0;
+ padding-right: 1px;
+ height: 2.25em;
+ white-space: nowrap;
+ list-style-type: none;
+ list-style-image: none;
+ background-image: url(images/preferences-break.png);
+ background-position: bottom right;
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #preftoc li:first-child {
+ margin-left: 1px;
+ }
+ #preftoc a,
+ #preftoc a:active {
+ display: inline-block;
+ position: relative;
+ color: #0645ad;
+ padding: 0.5em;
+ text-decoration: none;
+ background-image: none;
+ font-size: 0.9em;
+ }
+ #preftoc a:hover {
+ text-decoration: underline;
+ }
+ #preftoc li.selected a {
+ background-image: url(images/preferences-fade.png);
+ background-position: bottom;
+ background-repeat: repeat-x;
+ color: #333333;
+ text-decoration: none;
+ }
+#preferences {
+ float: left;
+ width: 100%;
+ margin: 0;
+ margin-top: -2px;
+ clear: both;
+ border: solid 1px #cccccc;
+ background-color: #f9f9f9;
+ background-image: url(images/preferences-base.png);
+}
+#preferences fieldset.prefsection {
+ border: none;
+ padding: 0;
+ margin: 1em;
+}
+#preferences fieldset.prefsection fieldset {
+ border: none;
+ border-top: solid 1px #cccccc;
+}
+#preferences legend {
+ color: #666666;
+}
+#preferences fieldset.prefsection legend.mainLegend {
+ display: none;
+}
+#preferences td {
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+}
+#preferences td.htmlform-tip {
+ font-size: x-small;
+ padding: .2em 2em;
+ color: #666666;
+}
+#preferences div.mw-prefs-buttons {
+ padding: 1em;
+}
+#preferences div.mw-prefs-buttons input {
+ margin-right: 0.25em;
+}
+
+/*
+ * Styles for the user login and create account forms
+ */
+#userlogin, #userloginForm {
+ border: solid 1px #cccccc;
+ padding: 1.2em;
+ margin: .5em;
+ float: left;
+}
+
+#userlogin {
+ min-width: 20em;
+ max-width: 90%;
+ width: 40em;
+}
+
+/*
+ *
+ * The following code is slightly modified from monobook
+ *
+ */
+#content {
+ line-height: 1.5em;
+}
+#bodyContent {
+ font-size: 0.8em;
+}
+/* Links */
+a {
+ text-decoration: none;
+ color: #0645ad;
+ /*color: #67536c;*/
+ background: none;
+}
+a:visited {
+ color: #0b0080;
+}
+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;
+}
+
+/* Inline Elements */
+img {
+ border: none;
+ vertical-align: middle;
+}
+hr {
+ height: 1px;
+ color: #aaa;
+ background-color: #aaa;
+ border: 0;
+ margin: .2em 0 .2em 0;
+}
+
+/* Structural Elements */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ /*color: black;*/
+ color: #67536c;
+ background: none;
+ font-weight: normal;
+ margin: 0;
+ padding-top: .5em;
+ padding-bottom: .17em;
+ border-bottom: 1px solid #aaa;
+ width: auto;
+}
+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; }
+p {
+ margin: .4em 0 .5em 0;
+ line-height: 1.5em;
+}
+ p img {
+ margin: 0;
+ }
+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;
+}*/
+code {
+ background-color: #f9f9f9;
+}
+pre {
+ padding: 1em;
+ border: 1px dashed #2f6fab;
+ color: black;
+ background-color: #f9f9f9;
+ line-height: 1.1em;
+}
+ul {
+ line-height: 1.5em;
+ list-style-type: square;
+ margin: .3em 0 0 1.5em;
+ padding: 0;
+ list-style-image: url(images/bullet-icon.png);
+}
+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;
+}
+/* Tables */
+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;
+}
+/* Forms */
+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;
+}
+select {
+ vertical-align: top;
+}
+/* Table of Contents */
+#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%;
+}
+/* Images */
+div.floatright, table.floatright {
+ clear: right;
+ float: right;
+ position: relative;
+ margin: 0 0 .5em .5em;
+ border: 0;
+}
+div.floatright p { font-style: italic; }
+div.floatleft, table.floatleft {
+ float: left;
+ clear: left;
+ position: relative;
+ margin: 0 .5em .5em 0;
+ border: 0;
+}
+div.floatleft p { font-style: italic; }
+/* Thumbnails */
+div.thumb {
+ margin-bottom: .5em;
+ border-style: solid;
+ border-color: white;
+ width: auto;
+ background-color: transparent;
+}
+div.thumbinner {
+ border: 1px solid #cccccc;
+ 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;
+}
+/* Warning */
+.mw-warning {
+ margin-left: 50px;
+ margin-right: 50px;
+ text-align: center;
+}
+/* User Message */
+.usermessage {
+ background-color: #ffce7b;
+ border: 1px solid #ffa500;
+ color: black;
+ font-weight: bold;
+ margin: 2em 0 1em;
+ padding: .5em 1em;
+ vertical-align: middle;
+}
+/* Site Notice */
+#siteNotice {
+ text-align: center;
+ font-size: 0.8em;
+ margin: 0;
+}
+ #siteNotice div,
+ #siteNotice p {
+ margin: 0;
+ padding: 0;
+ margin-bottom: 0.9em;
+ }
+/* Categories */
+.catlinks {
+ border: 1px solid #888;
+ background-color: #cccccc;
+ padding: 5px;
+ margin-top: 1em;
+ clear: both;
+}
+/* Sub-navigation */
+#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;
+}
+/* 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%;
+}
+/* Edge Cases for Content */
+h1, h2 {
+ margin-bottom: .6em;
+}
+h3, h4, h5 {
+ margin-bottom: .3em;
+}
+#firstHeading {
+ padding-top: 0;
+ margin-top: 0;
+ padding-top: 0;
+ margin-bottom: 0.1em;
+ line-height: 1.2em;
+ font-size: 1.6em;
+ padding-bottom: 0;
+}
+#content a.external,
+#content a[href ^="gopher://"] {
+ background: url(images/external-link-ltr-icon.png) center right no-repeat;
+ padding: 0 13px 0 0;
+}
+#content a[href ^="https://"],
+.link-https {
+ background: url(images/lock-icon.png) center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a[href ^="mailto:"],
+.link-mailto {
+ background: url(images/mail-icon.png) center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a[href ^="news://"] {
+ background: url(images/news-icon.png) center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a[href ^="ftp://"],
+.link-ftp {
+ background: url(images/file-icon.png) center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a[href ^="irc://"],
+#content a.extiw[href ^="irc://"],
+.link-irc {
+ background: url(images/talk-icon.png) center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a.external[href $=".ogg"], #content a.external[href $=".OGG"],
+#content a.external[href $=".mid"], #content a.external[href $=".MID"],
+#content a.external[href $=".midi"], #content a.external[href $=".MIDI"],
+#content a.external[href $=".mp3"], #content a.external[href $=".MP3"],
+#content a.external[href $=".wav"], #content a.external[href $=".WAV"],
+#content a.external[href $=".wma"], #content a.external[href $=".WMA"],
+.link-audio {
+ background: url("images/audio-icon.png") center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a.external[href $=".ogm"], #content a.external[href $=".OGM"],
+#content a.external[href $=".avi"], #content a.external[href $=".AVI"],
+#content a.external[href $=".mpeg"], #content a.external[href $=".MPEG"],
+#content a.external[href $=".mpg"], #content a.external[href $=".MPG"],
+.link-video {
+ background: url("images/video-icon.png") center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a.external[href $=".pdf"], #content a.external[href $=".PDF"],
+#content a.external[href *=".pdf#"], #content a.external[href *=".PDF#"],
+#content a.external[href *=".pdf?"], #content a.external[href *=".PDF?"],
+.link-document {
+ background: url("images/document-icon.png") center right no-repeat;
+ padding: 0 18px 0 0;
+}
+/* Interwiki Styling (Disabled) */
+#content a.extiw,
+#content a.extiw:active {
+ color: #36b;
+ background: none;
+ padding: 0;
+}
+#content a.external {
+ color: #36b;
+}
+#content .printfooter {
+ display: none;
+}
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+ background: url(images/user-icon.png) left top no-repeat;
+ padding-left: 15px !important;
+ text-transform: none;
+}
+
+.toccolours {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+#bodyContent {
+ position: relative;
+ width: 100%;
+}
+#mw-js-message {
+ font-size: 0.8em;
+}
+div#bodyContent {
+ line-height: 1.5em;
+}
+
+/* Watch/Unwatch Icon Styling */
+#ca-unwatch.icon,
+#ca-watch.icon {
+ margin-right:1px;
+}
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+ margin: 0;
+ padding: 0;
+ outline: none;
+ display: block;
+ width: 26px;
+ height: 2.5em;
+}
+#ca-unwatch.icon a {
+ background-image: url(images/watch-icons.png);
+ background-position: -43px 60%;
+}
+#ca-watch.icon a {
+ background-image: url(images/watch-icons.png);
+ background-position: 5px 60%;
+}
+#ca-unwatch.icon a:hover {
+ background-image: url(images/watch-icons.png);
+ background-position: -67px 60%;
+}
+#ca-watch.icon a:hover {
+ background-image: url(images/watch-icons.png);
+ background-position: -19px 60%;
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+ background-image: url(images/watch-icon-loading.gif);
+ background-position: center 60%;
+}
+#ca-unwatch.icon a span,
+#ca-watch.icon a span {
+ display: none;
+}
+div.vectorTabs ul {
+ background-image:url(images/tab-break.png);
+ background-position:right bottom;
+ background-repeat:no-repeat;
+}
--- /dev/null
+/*
+ * main-rtl.css is automatically generated using CSSJanus, a python script for
+ * creating RTL versions of otherwise LTR stylesheets.
+ *
+ * You may download the tool to rebuild this stylesheet
+ * http://code.google.com/p/cssjanus/
+ *
+ * An online version of this tool can be used at:
+ * http://cssjanus.commoner.com/
+ *
+ * The following command is used to generate the RTL version of this file
+ * ./cssjanus.py --swap_ltr_rtl_in_url < main-ltr.css > main-rtl.css
+ *
+ * Any rules which should not be flipped should be prepended with @noflip in
+ * a comment block.
+ */
+/* Framework */
+html,
+body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+body {
+ background-color: #f3f3f3;
+ background-image: url(images/page-base.png);
+}
+/* Content */
+#content {
+ margin-right: 10em;
+ padding: 1em;
+ background-image: url(images/border.png);
+ background-position: top right;
+ background-repeat: repeat-y;
+ background-color: white;
+}
+/* Head */
+#mw-page-base {
+ height: 5em;
+ background-color: white;
+ background-image: url(images/page-fade.png);
+ background-position: bottom right;
+ background-repeat: repeat-x;
+}
+#mw-head-base {
+ margin-top: -5em;
+ margin-right: 10em;
+ height: 5em;
+ background-image: url(images/border.png);
+ background-position: bottom right;
+ background-repeat: repeat-x;
+}
+#mw-head {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+}
+#mw-head h5 {
+ margin: 0;
+ padding: 0;
+}
+ /* Hide empty portlets */
+ div.emptyPortlet {
+ display: none;
+ }
+ /* Personal */
+ #p-personal {
+ position: absolute;
+ top: 0;
+ margin-right: 10em;
+ left: 0.75em;
+ }
+ #p-personal h5 {
+ display: none;
+ }
+ #p-personal ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+ /* @noflip */
+ #p-personal li {
+ line-height: 1.125em;
+ float: left;
+ }
+ #p-personal li {
+ margin-right: 0.75em;
+ margin-top: 0.5em;
+ font-size: 0.75em;
+ }
+ /* Navigation Containers */
+ #left-navigation {
+ position: absolute;
+ right: 10em;
+ top: 2.5em;
+ }
+ #right-navigation {
+ float: left;
+ margin-top: 2.5em;
+ }
+ /* Navigation Labels */
+ div.vectorTabs h5,
+ div.vectorMenu h5 span {
+ display: none;
+ }
+ /* Namespaces and Views */
+ /* @noflip */
+ div.vectorTabs {
+ float: left;
+ }
+ div.vectorTabs {
+ background-image: url(images/tab-break.png);
+ background-position: bottom right;
+ background-repeat: no-repeat;
+ padding-right: 1px;
+ }
+ /* @noflip */
+ div.vectorTabs ul {
+ float: left;
+ }
+ div.vectorTabs ul {
+ height: 100%;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+ /* @noflip */
+ div.vectorTabs ul li {
+ float: left;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorTabs ul li {
+ line-height: 1.125em;
+ display: inline-block;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ background-color: #f3f3f3;
+ background-image: url(images/tab-normal-fade.png);
+ background-position: bottom right;
+ background-repeat: repeat-x;
+ white-space:nowrap;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorTabs ul > li {
+ display: block;
+ }
+ div.vectorTabs li.selected {
+ background-image: url(images/tab-current-fade.png);
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorTabs li a {
+ display: inline-block;
+ height: 2.5em;
+ padding-right: 0.4em;
+ padding-left: 0.4em;
+ background-image: url(images/tab-break.png);
+ background-position: bottom left;
+ background-repeat: no-repeat;
+ }
+ div.vectorTabs li a,
+ div.vectorTabs li a span {
+ color: #0645ad;
+ cursor: pointer;
+ }
+ div.vectorTabs li a span {
+ font-size: 0.8em;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorTabs li > a {
+ display: block;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorTabs a span {
+ display: inline-block;
+ padding-top: 1.25em;
+ }
+ /* IGNORED BY IE6 */
+ /* @noflip */
+ div.vectorTabs a > span {
+ float: left;
+ display: block;
+ }
+ div.vectorTabs li.selected a,
+ div.vectorTabs li.selected a span,
+ div.vectorTabs li.selected a:visited
+ div.vectorTabs li.selected a:visited span {
+ color: #333333;
+ text-decoration: none;
+ }
+ div.vectorTabs li.new a,
+ div.vectorTabs li.new a span,
+ div.vectorTabs li.new a:visited,
+ div.vectorTabs li.new a:visited span {
+ color: #a55858;
+ }
+ /* Variants and Actions */
+ /* @noflip */
+ div.vectorMenu {
+ direction: ltr;
+ float: left;
+ background-image: url(images/arrow-down-icon.png);
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+ /* @noflip */
+ body.rtl div.vectorMenu {
+ direction: rtl;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ /* @noflip */
+ #mw-head div.vectorMenu h5 {
+ float: left;
+ background-image: url(images/tab-break.png);
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #mw-head div.vectorMenu > h5 {
+ background-image: none;
+ }
+ #mw-head div.vectorMenu h5 {
+ background-position: bottom right;
+ margin-right: -1px;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ /* @noflip */
+ div.vectorMenu h5 a {
+ display: inline-block;
+ width: 24px;
+ height: 2.5em;
+ text-decoration: none;
+ background-image: url(images/tab-break.png);
+ background-repeat: no-repeat;
+ }
+ div.vectorMenu h5 a{
+ background-position: bottom left;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorMenu h5 > a {
+ display: block;
+ }
+ div.vectorMenu div.menu {
+ position: relative;
+ display: none;
+ clear: both;
+ text-align: right;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ /* @noflip */
+ body.rtl div.vectorMenu div.menu {
+ margin-left: 24px;
+ }
+ /* IGNORED BY IE6 */
+ /* @noflip */
+ body.rtl div.vectorMenu > div.menu {
+ margin-left: auto;
+ }
+ /* Fixes old versions of FireFox */
+ /* @noflip */
+ body.rtl div.vectorMenu > div.menu,
+ x:-moz-any-link {
+ margin-left: 23px;
+ }
+ div.vectorMenu:hover div.menu {
+ display: block;
+ }
+ div.vectorMenu ul {
+ position: absolute;
+ background-color: white;
+ border: solid 1px silver;
+ border-top-width: 0;
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ margin-right: -1px;
+ text-align: right;
+ }
+ /* Fixes old versions of FireFox */
+ div.vectorMenu ul,
+ x:-moz-any-link {
+ min-width: 5em;
+ }
+ /* Returns things back to normal in modern versions of FireFox */
+ div.vectorMenu ul,
+ x:-moz-any-link,
+ x:default {
+ min-width: 0;
+ }
+ div.vectorMenu li {
+ padding: 0;
+ margin: 0;
+ text-align: right;
+ line-height: 1em;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorMenu li a {
+ display: inline-block;
+ padding: 0.5em;
+ white-space: nowrap;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorMenu li > a {
+ display: block;
+ }
+ div.vectorMenu li a {
+ color: #0645ad;
+ cursor: pointer;
+ font-size: 0.8em;
+ }
+ div.vectorMenu li.selected a,
+ div.vectorMenu li.selected a:visited {
+ color: #333333;
+ text-decoration: none;
+ }
+ /* Search */
+ #p-search h5 {
+ display: none;
+ }
+ /* @noflip */
+ #p-search {
+ float: left;
+ }
+ #p-search {
+ margin-left: 0.5em;
+ margin-right: 0.5em;
+ }
+ #p-search form,
+ #p-search input {
+ margin: 0;
+ margin-top: 0.4em;
+ }
+ #simpleSearch {
+ margin-top: 0.5em;
+ position: relative;
+ border: solid 1px #AAAAAA;
+ background-color: white;
+ background-image: url(images/search-fade.png);
+ background-position: top right;
+ background-repeat: repeat-x;
+ }
+ #simpleSearch label {
+ font-size: 0.8em;
+ top: 0.25em;
+ }
+ #simpleSearch input#searchInput {
+ margin: 0;
+ border-width: 0;
+ padding: 0.25em;
+ line-height: 1em;
+ font-size: 0.8em;
+ width: 9em;
+ background-color: transparent;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ #simpleSearch button#searchButton {
+ margin: 0;
+ padding: 0;
+ width: 1.75em;
+ height: 1.5em;
+ border: none;
+ cursor: pointer;
+ background-color: transparent;
+ background-image: url(images/search-rtl.png);
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #simpleSearch > button#searchButton {
+ height: 100%;
+ }
+ .suggestions-special .special-label {
+ font-size: 0.8em;
+ color: gray;
+ }
+ .suggestions-special .special-query {
+ color: black;
+ font-style: italic;
+ }
+ .suggestions-special .special-hover {
+ background-color: silver;
+ }
+/* Panel */
+#mw-panel {
+ position: absolute;
+ top: 160px;
+ padding-top: 1em;
+ width: 10em;
+ right: 0;
+}
+ #mw-panel div.portal {
+ padding-bottom: 1.5em;
+ }
+ #mw-panel div.portal h5 {
+ font-weight: normal;
+ color: #444444;
+ padding: 0.25em;
+ padding-top: 0;
+ padding-right: 1.75em;
+ cursor: default;
+ border: none;
+ font-size: 0.75em;
+ }
+ #mw-panel div.portal div.body {
+ margin: 0;
+ padding-top: 0.5em;
+ margin-right: 1.25em;
+ background-image: url(images/portal-break.png);
+ background-repeat: no-repeat;
+ background-position: top right;
+ }
+ #mw-panel div.portal div.body ul {
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ }
+ #mw-panel div.portal div.body ul li {
+ line-height: 1.125em;
+ padding: 0;
+ padding-bottom: 0.5em;
+ margin: 0;
+ overflow: hidden;
+ font-size: 0.75em;
+ }
+ #mw-panel div.portal div.body ul li a {
+ color: #0645ad;
+ }
+ #mw-panel div.portal div.body ul li a:visited {
+ color: #0b0080;
+ }
+/* Footer */
+#footer {
+ margin-right: 10em;
+ margin-top: 0;
+ padding: 0.75em;
+ background-image: url(images/border.png);
+ background-position: top right;
+ background-repeat: repeat-x;
+}
+#footer ul {
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+#footer ul li {
+ margin: 0;
+ padding: 0;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ color: #333333;
+ font-size: 0.7em;
+}
+#footer #footer-icons {
+ float: left;
+}
+/* @noflip */
+body.ltr #footer #footer-places {
+ float: left;
+}
+#footer #footer-info li {
+ line-height: 1.4em;
+}
+#footer #footer-icons li {
+ float: right;
+ margin-right: 0.5em;
+ line-height: 2em;
+}
+#footer #footer-places li {
+ float: right;
+ margin-left: 1em;
+ line-height: 2em;
+}
+/* Logo */
+#p-logo {
+ position: absolute;
+ top: -160px;
+ right: 0;
+ width: 10em;
+ height: 160px;
+}
+#p-logo a {
+ display: block;
+ width: 10em;
+ height: 160px;
+ background-repeat: no-repeat;
+ background-position: center center;
+ text-decoration: none;
+}
+
+/*
+ *
+ * The following code is highly modified from monobook. It would be nice if the
+ * preftoc id was more human readable like preferences-toc for instance,
+ * howerver this would require backporting the other skins.
+ */
+
+/* Preferences */
+#preftoc {
+ /* Tabs */
+ width: 100%;
+ float: right;
+ clear: both;
+ margin: 0 !important;
+ padding: 0 !important;
+ background-image: url(images/preferences-break.png);
+ background-position: bottom right;
+ background-repeat: no-repeat;
+}
+ #preftoc li {
+ /* Tab */
+ float: right;
+ margin: 0;
+ padding: 0;
+ padding-left: 1px;
+ height: 2.25em;
+ white-space: nowrap;
+ list-style-type: none;
+ list-style-image: none;
+ background-image: url(images/preferences-break.png);
+ background-position: bottom left;
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #preftoc li:first-child {
+ margin-right: 1px;
+ }
+ #preftoc a,
+ #preftoc a:active {
+ display: inline-block;
+ position: relative;
+ color: #0645ad;
+ padding: 0.5em;
+ text-decoration: none;
+ background-image: none;
+ font-size: 0.9em;
+ }
+ #preftoc a:hover {
+ text-decoration: underline;
+ }
+ #preftoc li.selected a {
+ background-image: url(images/preferences-fade.png);
+ background-position: bottom;
+ background-repeat: repeat-x;
+ color: #333333;
+ text-decoration: none;
+ }
+#preferences {
+ float: right;
+ width: 100%;
+ margin: 0;
+ margin-top: -2px;
+ clear: both;
+ border: solid 1px #cccccc;
+ background-color: #f9f9f9;
+ background-image: url(images/preferences-base.png);
+}
+#preferences fieldset.prefsection {
+ border: none;
+ padding: 0;
+ margin: 1em;
+}
+#preferences fieldset.prefsection fieldset {
+ border: none;
+ border-top: solid 1px #cccccc;
+}
+#preferences legend {
+ color: #666666;
+}
+#preferences fieldset.prefsection legend.mainLegend {
+ display: none;
+}
+#preferences td {
+ padding-right: 0.5em;
+ padding-left: 0.5em;
+}
+#preferences td.htmlform-tip {
+ font-size: x-small;
+ padding: .2em 2em;
+ color: #666666;
+}
+#preferences div.mw-prefs-buttons {
+ padding: 1em;
+}
+#preferences div.mw-prefs-buttons input {
+ margin-left: 0.25em;
+}
+
+/*
+ * Styles for the user login and create account forms
+ */
+#userlogin, #userloginForm {
+ border: solid 1px #cccccc;
+ padding: 1.2em;
+ margin: .5em;
+ float: right;
+}
+
+#userlogin {
+ min-width: 20em;
+ max-width: 90%;
+ width: 40em;
+}
+
+/*
+ *
+ * The following code is slightly modified from monobook
+ *
+ */
+#content {
+ line-height: 1.5em;
+}
+#bodyContent {
+ font-size: 0.8em;
+}
+/* Links */
+a {
+ text-decoration: none;
+ color: #0645ad;
+ background: none;
+}
+a:visited {
+ color: #0b0080;
+}
+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;
+}
+
+/* Inline Elements */
+img {
+ border: none;
+ vertical-align: middle;
+}
+hr {
+ height: 1px;
+ color: #aaa;
+ background-color: #aaa;
+ border: 0;
+ margin: .2em 0 .2em 0;
+}
+
+/* Structural Elements */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ color: black;
+ background: none;
+ font-weight: normal;
+ margin: 0;
+ padding-top: .5em;
+ padding-bottom: .17em;
+ border-bottom: 1px solid #aaa;
+ width: auto;
+}
+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; }
+p {
+ margin: .4em 0 .5em 0;
+ line-height: 1.5em;
+}
+ p img {
+ margin: 0;
+ }
+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;
+}*/
+code {
+ background-color: #f9f9f9;
+}
+pre {
+ padding: 1em;
+ border: 1px dashed #2f6fab;
+ color: black;
+ background-color: #f9f9f9;
+ line-height: 1.1em;
+}
+ul {
+ line-height: 1.5em;
+ list-style-type: square;
+ margin: .3em 1.5em 0 0;
+ padding: 0;
+ list-style-image: url(images/bullet-icon.png);
+}
+ol {
+ line-height: 1.5em;
+ margin: .3em 3.2em 0 0;
+ 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-right: 2em;
+ margin-bottom: .1em;
+}
+/* Tables */
+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;
+}
+/* Forms */
+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;
+}
+select {
+ vertical-align: top;
+}
+/* Table of Contents */
+#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-right: 0;
+ padding-right: 0;
+ text-align: right;
+}
+#toc ul ul,
+.toc ul ul {
+ margin: 0 2em 0 0;
+}
+#toc .toctoggle,
+.toc .toctoggle {
+ font-size: 94%;
+}
+/* Images */
+div.floatright, table.floatright {
+ clear: left;
+ float: left;
+ position: relative;
+ margin: 0 .5em .5em 0;
+ border: 0;
+}
+div.floatright p { font-style: italic; }
+div.floatleft, table.floatleft {
+ float: right;
+ clear: right;
+ position: relative;
+ margin: 0 0 .5em .5em;
+ border: 0;
+}
+div.floatleft p { font-style: italic; }
+/* Thumbnails */
+div.thumb {
+ margin-bottom: .5em;
+ border-style: solid;
+ border-color: white;
+ width: auto;
+ background-color: transparent;
+}
+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: right;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
+}
+div.magnify {
+ float: left;
+ border: none !important;
+ background: none !important;
+}
+div.magnify a, div.magnify img {
+ display: block;
+ border: none !important;
+ background: none !important;
+}
+div.tright {
+ clear: left;
+ float: left;
+ border-width: .5em 1.4em .8em 0;
+}
+div.tleft {
+ float: right;
+ clear: right;
+ margin-left: .5em;
+ border-width: .5em 0 .8em 1.4em;
+}
+img.thumbborder {
+ border: 1px solid #dddddd;
+}
+.hiddenStructure {
+ display: none;
+}
+/* Warning */
+.mw-warning {
+ margin-right: 50px;
+ margin-left: 50px;
+ text-align: center;
+}
+/* User Message */
+.usermessage {
+ background-color: #ffce7b;
+ border: 1px solid #ffa500;
+ color: black;
+ font-weight: bold;
+ margin: 2em 0 1em;
+ padding: .5em 1em;
+ vertical-align: middle;
+}
+/* Site Notice */
+#siteNotice {
+ text-align: center;
+ font-size: 0.8em;
+ margin: 0;
+}
+ #siteNotice div,
+ #siteNotice p {
+ margin: 0;
+ padding: 0;
+ margin-bottom: 0.9em;
+ }
+/* Categories */
+.catlinks {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ margin-top: 1em;
+ clear: both;
+}
+/* Sub-navigation */
+#siteSub {
+ display: none;
+}
+#jump-to-nav {
+ display: none;
+}
+#contentSub, #contentSub2 {
+ font-size: 84%;
+ line-height: 1.2em;
+ margin: 0 1em 1.4em 0;
+ color: #7d7d7d;
+ width: auto;
+}
+span.subpages {
+ display: block;
+}
+/* Emulate Center */
+.center {
+ width: 100%;
+ text-align: center;
+}
+*.center * {
+ margin-right: auto;
+ margin-left: auto;
+}
+/* Small for tables and similar */
+.small, .small * {
+ font-size: 94%;
+}
+table.small {
+ font-size: 100%;
+}
+/* Edge Cases for Content */
+h1, h2 {
+ margin-bottom: .6em;
+}
+h3, h4, h5 {
+ margin-bottom: .3em;
+}
+#firstHeading {
+ padding-top: 0;
+ margin-top: 0;
+ padding-top: 0;
+ margin-bottom: 0.1em;
+ line-height: 1.2em;
+ font-size: 1.6em;
+ padding-bottom: 0;
+}
+#content a.external,
+#content a[href ^="gopher://"] {
+ background: url(images/external-link-rtl-icon.png) center left no-repeat;
+ padding: 0 0 0 13px;
+}
+#content a[href ^="https://"],
+.link-https {
+ background: url(images/lock-icon.png) center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a[href ^="mailto:"],
+.link-mailto {
+ background: url(images/mail-icon.png) center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a[href ^="news://"] {
+ background: url(images/news-icon.png) center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a[href ^="ftp://"],
+.link-ftp {
+ background: url(images/file-icon.png) center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a[href ^="irc://"],
+#content a.extiw[href ^="irc://"],
+.link-irc {
+ background: url(images/talk-icon.png) center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a.external[href $=".ogg"], #content a.external[href $=".OGG"],
+#content a.external[href $=".mid"], #content a.external[href $=".MID"],
+#content a.external[href $=".midi"], #content a.external[href $=".MIDI"],
+#content a.external[href $=".mp3"], #content a.external[href $=".MP3"],
+#content a.external[href $=".wav"], #content a.external[href $=".WAV"],
+#content a.external[href $=".wma"], #content a.external[href $=".WMA"],
+.link-audio {
+ background: url("images/audio-icon.png") center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a.external[href $=".ogm"], #content a.external[href $=".OGM"],
+#content a.external[href $=".avi"], #content a.external[href $=".AVI"],
+#content a.external[href $=".mpeg"], #content a.external[href $=".MPEG"],
+#content a.external[href $=".mpg"], #content a.external[href $=".MPG"],
+.link-video {
+ background: url("images/video-icon.png") center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a.external[href $=".pdf"], #content a.external[href $=".PDF"],
+#content a.external[href *=".pdf#"], #content a.external[href *=".PDF#"],
+#content a.external[href *=".pdf?"], #content a.external[href *=".PDF?"],
+.link-document {
+ background: url("images/document-icon.png") center left no-repeat;
+ padding: 0 0 0 18px;
+}
+/* Interwiki Styling (Disabled) */
+#content a.extiw,
+#content a.extiw:active {
+ color: #36b;
+ background: none;
+ padding: 0;
+}
+#content a.external {
+ color: #36b;
+}
+#content .printfooter {
+ display: none;
+}
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+ background: url(images/user-icon.png) right top no-repeat;
+ padding-right: 15px !important;
+ text-transform: none;
+}
+
+.toccolours {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+#bodyContent {
+ position: relative;
+ width: 100%;
+}
+#mw-js-message {
+ font-size: 0.8em;
+}
+div#bodyContent {
+ line-height: 1.5em;
+}
+
+/* Watch/Unwatch Icon Styling */
+#ca-unwatch.icon,
+#ca-watch.icon {
+ margin-left:1px;
+}
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+ margin: 0;
+ padding: 0;
+ outline: none;
+ display: block;
+ width: 26px;
+ height: 2.5em;
+}
+#ca-unwatch.icon a {
+ background-image: url(images/watch-icons.png);
+ background-position: -43px 60%;
+}
+#ca-watch.icon a {
+ background-image: url(images/watch-icons.png);
+ background-position: 5px 60%;
+}
+#ca-unwatch.icon a:hover {
+ background-image: url(images/watch-icons.png);
+ background-position: -67px 60%;
+}
+#ca-watch.icon a:hover {
+ background-image: url(images/watch-icons.png);
+ background-position: -19px 60%;
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+ background-image: url(images/watch-icon-loading.gif);
+ background-position: center 60%;
+}
+#ca-unwatch.icon a span,
+#ca-watch.icon a span {
+ display: none;
+}
+div.vectorTabs ul {
+ background-image:url(images/tab-break.png);
+ background-position:left bottom;
+ background-repeat:no-repeat;
+}