Hello!

To see the file structure, click on "tree".

Note that updates take place every 10 minutes, commits may not be seen immediately.
Added the planteome skin, built from the vector skin
authorpreecej <preecej@localhost>
Fri, 29 Jul 2011 23:41:31 +0000 (23:41 +0000)
committerpreecej <preecej@localhost>
Fri, 29 Jul 2011 23:41:31 +0000 (23:41 +0000)
svn path=/; revision=132

62 files changed:
preecej/semantic_wiki/skins/Planteome.deps.php [new file with mode: 0644]
preecej/semantic_wiki/skins/Planteome.php [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/Makefile [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/csshover.htc [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/cssjanus/COPYING [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/cssjanus/LICENSE [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/cssjanus/README [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/cssjanus/cssjanus.py [new file with mode: 0755]
preecej/semantic_wiki/skins/planteome/cssjanus/csslex.py [new file with mode: 0755]
preecej/semantic_wiki/skins/planteome/experiments/babaco-colors-a.css [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/babaco-colors-b.css [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/babaco-colors-c.css [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/images/new-border.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/images/new-portal-break-ltr.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/images/new-portal-break-rtl.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/images/page-base-fade.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/images/page-base-updated.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/images/tab-active-first.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/images/tab-active-last.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/images/tab-fade.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/images/tab-first.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/images/tab-last.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/images/tab-new-fade.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/experiments/new-tabs.css [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/arrow-down-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/audio-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/border.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/bullet-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/document-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/edit-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/external-link-ltr-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/external-link-rtl-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/file-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/link-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/lock-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/magnify-clip.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/mail-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/news-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/page-base.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/page-fade.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/portal-break-ltr.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/portal-break-rtl.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/portal-break.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/preferences-base.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/preferences-break.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/preferences-edge.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/preferences-fade.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/search-fade.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/search-ltr.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/search-rtl.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/tab-break.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/tab-current-fade.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/tab-normal-fade.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/talk-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/user-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/video-icon.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/watch-icon-loading.gif [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/images/watch-icons.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/main-ltr.css [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/main-rtl.css [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/wiki-indexed.png [new file with mode: 0644]
preecej/semantic_wiki/skins/planteome/wiki.png [new file with mode: 0644]

diff --git a/preecej/semantic_wiki/skins/Planteome.deps.php b/preecej/semantic_wiki/skins/Planteome.deps.php
new file mode 100644 (file)
index 0000000..7a8c288
--- /dev/null
@@ -0,0 +1,11 @@
+<?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');
diff --git a/preecej/semantic_wiki/skins/Planteome.php b/preecej/semantic_wiki/skins/Planteome.php
new file mode 100644 (file)
index 0000000..8886bd0
--- /dev/null
@@ -0,0 +1,770 @@
+<?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&section=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' ); ?>>&nbsp;</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";
+               }
+       }
+}
diff --git a/preecej/semantic_wiki/skins/planteome/Makefile b/preecej/semantic_wiki/skins/planteome/Makefile
new file mode 100644 (file)
index 0000000..74e36c4
--- /dev/null
@@ -0,0 +1,18 @@
+#
+# 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
diff --git a/preecej/semantic_wiki/skins/planteome/csshover.htc b/preecej/semantic_wiki/skins/planteome/csshover.htc
new file mode 100644 (file)
index 0000000..a88fa08
--- /dev/null
@@ -0,0 +1,262 @@
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+// <![CDATA[
+/**
+ *     Whatever:hover - V3.00.081222
+ *     ------------------------------------------------------------
+ *     Author  - Peter Nederlof, http://www.xs4all.nl/~peterned
+ *     License - http://creativecommons.org/licenses/LGPL/2.1
+ *
+ *     Whatever:hover is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU Lesser General Public
+ *     License as published by the Free Software Foundation; either
+ *     version 2.1 of the License, or (at your option) any later version.
+ *
+ *     Whatever:hover is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ *     Lesser General Public License for more details.
+ *
+ *     howto: body { behavior:url("csshover3.htc"); }
+ *     ------------------------------------------------------------
+ */
+
+window.CSSHover = (function(){
+
+       // regular expressions, used and explained later on.
+       var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(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
diff --git a/preecej/semantic_wiki/skins/planteome/cssjanus/COPYING b/preecej/semantic_wiki/skins/planteome/cssjanus/COPYING
new file mode 100644 (file)
index 0000000..3f2c895
--- /dev/null
@@ -0,0 +1,13 @@
+   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.
diff --git a/preecej/semantic_wiki/skins/planteome/cssjanus/LICENSE b/preecej/semantic_wiki/skins/planteome/cssjanus/LICENSE
new file mode 100644 (file)
index 0000000..d645695
--- /dev/null
@@ -0,0 +1,202 @@
+
+                                 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.
diff --git a/preecej/semantic_wiki/skins/planteome/cssjanus/README b/preecej/semantic_wiki/skins/planteome/cssjanus/README
new file mode 100644 (file)
index 0000000..9b92215
--- /dev/null
@@ -0,0 +1,91 @@
+=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.
+}}}
diff --git a/preecej/semantic_wiki/skins/planteome/cssjanus/cssjanus.py b/preecej/semantic_wiki/skins/planteome/cssjanus/cssjanus.py
new file mode 100755 (executable)
index 0000000..dd14bd5
--- /dev/null
@@ -0,0 +1,574 @@
+#!/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:])
diff --git a/preecej/semantic_wiki/skins/planteome/cssjanus/csslex.py b/preecej/semantic_wiki/skins/planteome/cssjanus/csslex.py
new file mode 100755 (executable)
index 0000000..1fc7304
--- /dev/null
@@ -0,0 +1,114 @@
+#!/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'<!--|-->|~=|\|=|[\{\+>,:;]'
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/babaco-colors-a.css b/preecej/semantic_wiki/skins/planteome/experiments/babaco-colors-a.css
new file mode 100644 (file)
index 0000000..ce6f67d
--- /dev/null
@@ -0,0 +1,109 @@
+/* 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;
+}
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/babaco-colors-b.css b/preecej/semantic_wiki/skins/planteome/experiments/babaco-colors-b.css
new file mode 100644 (file)
index 0000000..227e197
--- /dev/null
@@ -0,0 +1,67 @@
+/* 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;
+}
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/babaco-colors-c.css b/preecej/semantic_wiki/skins/planteome/experiments/babaco-colors-c.css
new file mode 100644 (file)
index 0000000..d2dabf7
--- /dev/null
@@ -0,0 +1,91 @@
+/* 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
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/images/new-border.png b/preecej/semantic_wiki/skins/planteome/experiments/images/new-border.png
new file mode 100644 (file)
index 0000000..735324e
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/experiments/images/new-border.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/images/new-portal-break-ltr.png b/preecej/semantic_wiki/skins/planteome/experiments/images/new-portal-break-ltr.png
new file mode 100644 (file)
index 0000000..cd8f3b1
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/experiments/images/new-portal-break-ltr.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/images/new-portal-break-rtl.png b/preecej/semantic_wiki/skins/planteome/experiments/images/new-portal-break-rtl.png
new file mode 100644 (file)
index 0000000..45c5b2f
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/experiments/images/new-portal-break-rtl.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/images/page-base-fade.png b/preecej/semantic_wiki/skins/planteome/experiments/images/page-base-fade.png
new file mode 100644 (file)
index 0000000..dc63182
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/experiments/images/page-base-fade.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/images/page-base-updated.png b/preecej/semantic_wiki/skins/planteome/experiments/images/page-base-updated.png
new file mode 100644 (file)
index 0000000..54ffeb0
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/experiments/images/page-base-updated.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/images/tab-active-first.png b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-active-first.png
new file mode 100644 (file)
index 0000000..e4c39c4
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-active-first.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/images/tab-active-last.png b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-active-last.png
new file mode 100644 (file)
index 0000000..a96f391
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-active-last.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/images/tab-fade.png b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-fade.png
new file mode 100644 (file)
index 0000000..1eb0e23
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-fade.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/images/tab-first.png b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-first.png
new file mode 100644 (file)
index 0000000..439b713
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-first.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/images/tab-last.png b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-last.png
new file mode 100644 (file)
index 0000000..08e283d
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-last.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/images/tab-new-fade.png b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-new-fade.png
new file mode 100644 (file)
index 0000000..4492550
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/experiments/images/tab-new-fade.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/experiments/new-tabs.css b/preecej/semantic_wiki/skins/planteome/experiments/new-tabs.css
new file mode 100644 (file)
index 0000000..e3850e8
--- /dev/null
@@ -0,0 +1,322 @@
+/* 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;
+}
diff --git a/preecej/semantic_wiki/skins/planteome/images/arrow-down-icon.png b/preecej/semantic_wiki/skins/planteome/images/arrow-down-icon.png
new file mode 100644 (file)
index 0000000..bf2d4fb
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/arrow-down-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/audio-icon.png b/preecej/semantic_wiki/skins/planteome/images/audio-icon.png
new file mode 100644 (file)
index 0000000..0f59a2b
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/audio-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/border.png b/preecej/semantic_wiki/skins/planteome/images/border.png
new file mode 100644 (file)
index 0000000..54b4792
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/border.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/bullet-icon.png b/preecej/semantic_wiki/skins/planteome/images/bullet-icon.png
new file mode 100644 (file)
index 0000000..e304b26
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/bullet-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/document-icon.png b/preecej/semantic_wiki/skins/planteome/images/document-icon.png
new file mode 100644 (file)
index 0000000..91dc16f
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/document-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/edit-icon.png b/preecej/semantic_wiki/skins/planteome/images/edit-icon.png
new file mode 100644 (file)
index 0000000..4a96276
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/edit-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/external-link-ltr-icon.png b/preecej/semantic_wiki/skins/planteome/images/external-link-ltr-icon.png
new file mode 100644 (file)
index 0000000..4b710b0
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/external-link-ltr-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/external-link-rtl-icon.png b/preecej/semantic_wiki/skins/planteome/images/external-link-rtl-icon.png
new file mode 100644 (file)
index 0000000..17df03a
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/external-link-rtl-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/file-icon.png b/preecej/semantic_wiki/skins/planteome/images/file-icon.png
new file mode 100644 (file)
index 0000000..1261f00
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/file-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/link-icon.png b/preecej/semantic_wiki/skins/planteome/images/link-icon.png
new file mode 100644 (file)
index 0000000..fc77e81
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/link-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/lock-icon.png b/preecej/semantic_wiki/skins/planteome/images/lock-icon.png
new file mode 100644 (file)
index 0000000..9e63807
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/lock-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/magnify-clip.png b/preecej/semantic_wiki/skins/planteome/images/magnify-clip.png
new file mode 100644 (file)
index 0000000..00a9cee
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/magnify-clip.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/mail-icon.png b/preecej/semantic_wiki/skins/planteome/images/mail-icon.png
new file mode 100644 (file)
index 0000000..50de078
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/mail-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/news-icon.png b/preecej/semantic_wiki/skins/planteome/images/news-icon.png
new file mode 100644 (file)
index 0000000..8ab4995
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/news-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/page-base.png b/preecej/semantic_wiki/skins/planteome/images/page-base.png
new file mode 100644 (file)
index 0000000..17d02a7
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/page-base.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/page-fade.png b/preecej/semantic_wiki/skins/planteome/images/page-fade.png
new file mode 100644 (file)
index 0000000..815a048
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/page-fade.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/portal-break-ltr.png b/preecej/semantic_wiki/skins/planteome/images/portal-break-ltr.png
new file mode 100644 (file)
index 0000000..c182370
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/portal-break-ltr.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/portal-break-rtl.png b/preecej/semantic_wiki/skins/planteome/images/portal-break-rtl.png
new file mode 100644 (file)
index 0000000..a45144c
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/portal-break-rtl.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/portal-break.png b/preecej/semantic_wiki/skins/planteome/images/portal-break.png
new file mode 100644 (file)
index 0000000..e81b559
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/portal-break.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/preferences-base.png b/preecej/semantic_wiki/skins/planteome/images/preferences-base.png
new file mode 100644 (file)
index 0000000..adfd70d
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/preferences-base.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/preferences-break.png b/preecej/semantic_wiki/skins/planteome/images/preferences-break.png
new file mode 100644 (file)
index 0000000..6c5c68c
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/preferences-break.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/preferences-edge.png b/preecej/semantic_wiki/skins/planteome/images/preferences-edge.png
new file mode 100644 (file)
index 0000000..3da0d09
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/preferences-edge.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/preferences-fade.png b/preecej/semantic_wiki/skins/planteome/images/preferences-fade.png
new file mode 100644 (file)
index 0000000..b4773c5
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/preferences-fade.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/search-fade.png b/preecej/semantic_wiki/skins/planteome/images/search-fade.png
new file mode 100644 (file)
index 0000000..53461d6
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/search-fade.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/search-ltr.png b/preecej/semantic_wiki/skins/planteome/images/search-ltr.png
new file mode 100644 (file)
index 0000000..1db2eb2
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/search-ltr.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/search-rtl.png b/preecej/semantic_wiki/skins/planteome/images/search-rtl.png
new file mode 100644 (file)
index 0000000..c26c8d0
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/search-rtl.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/tab-break.png b/preecej/semantic_wiki/skins/planteome/images/tab-break.png
new file mode 100644 (file)
index 0000000..8115556
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/tab-break.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/tab-current-fade.png b/preecej/semantic_wiki/skins/planteome/images/tab-current-fade.png
new file mode 100644 (file)
index 0000000..c6238d2
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/tab-current-fade.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/tab-normal-fade.png b/preecej/semantic_wiki/skins/planteome/images/tab-normal-fade.png
new file mode 100644 (file)
index 0000000..4a5e3e4
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/tab-normal-fade.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/talk-icon.png b/preecej/semantic_wiki/skins/planteome/images/talk-icon.png
new file mode 100644 (file)
index 0000000..0b80ee9
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/talk-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/user-icon.png b/preecej/semantic_wiki/skins/planteome/images/user-icon.png
new file mode 100644 (file)
index 0000000..ac3d59d
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/user-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/video-icon.png b/preecej/semantic_wiki/skins/planteome/images/video-icon.png
new file mode 100644 (file)
index 0000000..5e7f4af
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/video-icon.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/watch-icon-loading.gif b/preecej/semantic_wiki/skins/planteome/images/watch-icon-loading.gif
new file mode 100644 (file)
index 0000000..618c308
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/watch-icon-loading.gif differ
diff --git a/preecej/semantic_wiki/skins/planteome/images/watch-icons.png b/preecej/semantic_wiki/skins/planteome/images/watch-icons.png
new file mode 100644 (file)
index 0000000..54b2c79
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/images/watch-icons.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/main-ltr.css b/preecej/semantic_wiki/skins/planteome/main-ltr.css
new file mode 100644 (file)
index 0000000..0b0f46d
--- /dev/null
@@ -0,0 +1,1200 @@
+/*
+ * 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;
+}
diff --git a/preecej/semantic_wiki/skins/planteome/main-rtl.css b/preecej/semantic_wiki/skins/planteome/main-rtl.css
new file mode 100644 (file)
index 0000000..5387289
--- /dev/null
@@ -0,0 +1,1128 @@
+/*
+ * 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;
+}
diff --git a/preecej/semantic_wiki/skins/planteome/wiki-indexed.png b/preecej/semantic_wiki/skins/planteome/wiki-indexed.png
new file mode 100644 (file)
index 0000000..189a2ae
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/wiki-indexed.png differ
diff --git a/preecej/semantic_wiki/skins/planteome/wiki.png b/preecej/semantic_wiki/skins/planteome/wiki.png
new file mode 100644 (file)
index 0000000..2463b52
Binary files /dev/null and b/preecej/semantic_wiki/skins/planteome/wiki.png differ