summaryrefslogtreecommitdiff
path: root/buildscripts/wikibuilder
diff options
context:
space:
mode:
authorwei <>2006-10-12 07:30:33 +0000
committerwei <>2006-10-12 07:30:33 +0000
commit5abdafeb9ded0c1c41992f7b3758f1dc02255683 (patch)
treec5c344f0285e9b5dcd540eeaa1a701f47e14b4bb /buildscripts/wikibuilder
parentde630e4134484cea82fd0a1864a45db3bd9974bc (diff)
add unified chm build (quickstart + API + classdocs + wiki)
Diffstat (limited to 'buildscripts/wikibuilder')
-rw-r--r--buildscripts/wikibuilder/DumpSkin.php93
-rw-r--r--buildscripts/wikibuilder/build.php18
-rw-r--r--buildscripts/wikibuilder/dumpHTML.inc390
-rw-r--r--buildscripts/wikibuilder/dumpHTML.php102
-rw-r--r--buildscripts/wikibuilder/external.pngbin0 -> 165 bytes
-rw-r--r--buildscripts/wikibuilder/main.css501
6 files changed, 1104 insertions, 0 deletions
diff --git a/buildscripts/wikibuilder/DumpSkin.php b/buildscripts/wikibuilder/DumpSkin.php
new file mode 100644
index 00000000..6d4ba4b3
--- /dev/null
+++ b/buildscripts/wikibuilder/DumpSkin.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * MonoBook nouveau
+ *
+ * Translated from gwicke's previous TAL template version to remove
+ * dependency on PHPTAL.
+ *
+ * @todo document
+ * @package MediaWiki
+ * @subpackage Skins
+ */
+
+/**
+ * MonoBook modified and redesigned by JasonPearce.com for FraternityManuals.com
+ * Launched April 7, 2005
+ */
+
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
+/** */
+require_once('includes/SkinTemplate.php');
+
+/**
+ * Inherit main code from SkinTemplate, set the CSS and template filter.
+ * @todo document
+ * @package MediaWiki
+ * @subpackage Skins
+ */
+class DumpSkin extends SkinTemplate {
+ /** Using monobook. */
+ function initPage( &$out ) {
+ SkinTemplate::initPage( $out );
+ $this->skinname = 'dump';
+ $this->stylename = '';
+ $this->template = 'DumpTemplate';
+ }
+}
+
+class DumpTemplate extends QuickTemplate {
+ /**
+ * Template filter callback for MonoBook skin.
+ * Takes an associative array of data set from a SkinTemplate-based
+ * class, and a wrapper for MediaWiki's localization database, and
+ * outputs a formatted page.
+ *
+ * @access private
+ */
+ function execute() {
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php $this->text('lang') ?>" lang="<?php $this->text('lang') ?>" dir="<?php $this->text('dir') ?>">
+<head>
+<meta http-equiv="Content-Type" content="<?php $this->text('mimetype') ?>; charset=<?php $this->text('charset') ?>" />
+<title>WIKI: <?php $this->text('pagetitle') ?>
+</title>
+<link rel="stylesheet" type="text/css" href="<?php $this->text('stylepath') ?>main.css" />
+</head>
+<body>
+<div id="globalWrapper">
+ <div id="column-content">
+ <div id="content"> <a name="top" id="contentTop"></a>
+
+ <h1 class="firstHeading">
+ <?php $this->text('title') ?>
+ </h1>
+ <h3 id="siteSub">
+ <?php $this->msg('tagline') ?>
+ </h3>
+
+ <div id="bodyContent">
+ <div id="contentSub">
+ <?php $this->html('subtitle') ?>
+ </div>
+
+ <!-- BEGIN content -->
+ <?php $this->html('bodytext') ?>
+ <?php if($this->data['catlinks']) { ?>
+ <div id="catlinks">
+ <?php $this->html('catlinks') ?>
+ </div>
+ <?php } ?>
+
+ <!-- END content -->
+ </div>
+
+ </div>
+ </div>
+</div>
+<!-- end of the left (by default at least) column -->
+<img src="<?php $this->text('stylepath') ?>external.png" style="display:none"/>
+</body></html>
+<?php } } ?>
diff --git a/buildscripts/wikibuilder/build.php b/buildscripts/wikibuilder/build.php
new file mode 100644
index 00000000..3ee8a078
--- /dev/null
+++ b/buildscripts/wikibuilder/build.php
@@ -0,0 +1,18 @@
+<?php
+
+$wiki_dir = 'c:/Wei/workspace/wiki/';
+$wiki_url = 'http://www.pradosoft.com/wiki/';
+
+$ROOT = dirname(__FILE__);
+
+$output_dir = $ROOT.'/../../build/docs/wiki';
+
+include_once(dirname(__FILE__).'/dumpHTML.php');
+
+if(!is_file($output_dir.'/external.png'))
+{
+ copy($ROOT.'/external.png', $output_dir.'/external.png');
+ copy($ROOT.'/main.css', $output_dir.'/main.css');
+}
+
+?> \ No newline at end of file
diff --git a/buildscripts/wikibuilder/dumpHTML.inc b/buildscripts/wikibuilder/dumpHTML.inc
new file mode 100644
index 00000000..5b8ca15a
--- /dev/null
+++ b/buildscripts/wikibuilder/dumpHTML.inc
@@ -0,0 +1,390 @@
+<?php
+/**
+ * @package MediaWiki
+ * @subpackage Maintenance
+ */
+
+define( 'REPORTING_INTERVAL', 10 );
+
+require_once( 'includes/ImagePage.php' );
+require_once( 'includes/CategoryPage.php' );
+
+class DumpHTML {
+ # Destination directory
+ var $dest;
+
+ # Show interlanguage links?
+ var $interwiki = true;
+
+ # Depth of HTML directory tree
+ var $depth = 3;
+
+ # Directory that commons images are copied into
+ var $sharedStaticPath;
+
+ # Relative path to image directory
+ var $imageRel = 'upload';
+
+ # Copy commons images instead of symlinking
+ var $forceCopy = false;
+
+ # Make links assuming the script path is in the same directory as
+ # the destination
+ var $alternateScriptPath = false;
+
+ function DumpHTML( $settings ) {
+ foreach ( $settings as $var => $value ) {
+ $this->$var = $value;
+ }
+ }
+
+ /**
+ * Write a set of articles specified by start and end page_id
+ * Skip categories and images, they will be done separately
+ */
+ function doArticles( $start, $end = false ) {
+ $fname = 'DumpHTML::doArticles';
+
+ $this->setupGlobals();
+
+ if ( $end === false ) {
+ $dbr =& wfGetDB( DB_SLAVE );
+ $end = $dbr->selectField( 'page', 'max(page_id)', false, $fname );
+ }
+
+
+ for ($id = $start; $id <= $end; $id++) {
+ if ( !($id % REPORTING_INTERVAL) ) {
+ print "Processing ID: $id\r";
+ }
+ $title = DumpTitle::newFromID( $id );
+ if ( $title ) {
+ $ns = $title->getNamespace() ;
+ if ( $ns != NS_CATEGORY ) {
+ $this->doArticle( $title );
+ }
+ }
+ }
+ print "\n";
+ }
+
+ function doSpecials() {
+ $this->doMainPage();
+
+ $this->setupGlobals();
+ print "Special:Categories...";
+ $this->doArticle( DumpTitle::makeTitle( NS_SPECIAL, 'Categories' ) );
+ print "\n";
+ }
+
+ /** Write the main page as index.html */
+ function doMainPage() {
+ global $wgMakeDumpLinks;
+
+ print "Making index.html ";
+
+ // Set up globals with no ../../.. in the link URLs
+ $this->setupGlobals( 0 );
+
+ // But still use that directory style
+ $wgMakeDumpLinks = 3;
+
+ $title = DumpTitle::newMainPage();
+
+ $text = $this->getArticleHTML( $title );
+ $file = fopen( "{$this->dest}/index.html", "w" );
+ if ( !$file ) {
+ print "\nCan't open index.html for writing\n";
+ return false;
+ }
+ fwrite( $file, $text );
+ fclose( $file );
+ print "\n";
+ }
+
+ function doImageDescriptions() {
+ global $wgSharedUploadDirectory;
+
+ $fname = 'DumpHTML::doImageDescriptions';
+
+ $this->setupGlobals( 3 );
+
+ /**
+ * Dump image description pages that don't have an associated article, but do
+ * have a local image
+ */
+ $dbr =& wfGetDB( DB_SLAVE );
+ extract( $dbr->tableNames( 'image', 'page' ) );
+ $res = $dbr->select( 'image', array( 'img_name' ), false, $fname );
+
+ $i = 0;
+ print "Writing image description pages for local images\n";
+ $num = $dbr->numRows( $res );
+ while ( $row = $dbr->fetchObject( $res ) ) {
+ if ( !( ++$i % REPORTING_INTERVAL ) ) {
+ print "Done $i of $num\r";
+ }
+ $title = DumpTitle::makeTitle( NS_IMAGE, $row->img_name );
+ if ( $title->getArticleID() ) {
+ // Already done by dumpHTML
+ continue;
+ }
+ $this->doArticle( $title );
+ }
+ print "\n";
+
+ /**
+ * Dump images which only have a real description page on commons
+ */
+ print "Writing description pages for commons images\n";
+ $i = 0;
+ for ( $hash = 0; $hash < 256; $hash++ ) {
+ $dir = sprintf( "%01x/%02x", intval( $hash / 16 ), $hash );
+ $paths = glob( "{$this->sharedStaticPath}/$dir/*" );
+ $paths += glob( "{$this->sharedStaticPath}/thumb/$dir/*" );
+
+ foreach ( $paths as $path ) {
+ $file = basename( $path );
+ if ( !(++$i % REPORTING_INTERVAL ) ) {
+ print "$i\r";
+ }
+
+ $title = DumpTitle::makeTitle( NS_IMAGE, $file );
+ $this->doArticle( $title );
+ }
+ }
+ print "\n";
+ }
+
+ function doCategories() {
+ $fname = 'DumpHTML::doCategories';
+ $this->setupGlobals();
+
+ $dbr =& wfGetDB( DB_SLAVE );
+ print "Selecting categories...";
+ $sql = 'SELECT DISTINCT cl_to FROM ' . $dbr->tableName( 'categorylinks' );
+ $res = $dbr->query( $sql, $fname );
+
+ print "\nWriting " . $dbr->numRows( $res ). " category pages\n";
+ $i = 0;
+ while ( $row = $dbr->fetchObject( $res ) ) {
+ if ( !(++$i % REPORTING_INTERVAL ) ) {
+ print "$i\r";
+ }
+ $title = DumpTitle::makeTitle( NS_CATEGORY, $row->cl_to );
+ $this->doArticle( $title );
+ }
+ print "\n";
+ }
+
+
+ /** Write an article specified by title */
+ function doArticle( $title ) {
+ global $wgTitle, $wgSharedUploadPath, $wgSharedUploadDirectory;
+ global $wgUploadDirectory;
+
+ $text = $this->getArticleHTML( $title );
+ if ( $text === false ) {
+ return;
+ }
+
+ # Parse the XHTML to find the images
+ $images = $this->findImages( $text );
+ $this->copyImages( $images );
+
+ # Write to file
+ $this->writeArticle( $title, $text );
+ }
+
+ /** Write the given text to the file identified by the given title object */
+ function writeArticle( &$title, $text ) {
+ $filename = strtr($title->getHashedFilename(),':~','__');
+ $fullName = "{$this->dest}/$filename";
+ $fullDir = dirname( $fullName );
+
+ wfMkdirParents( $fullDir, 0755 );
+
+ $file = fopen( $fullName, 'w' );
+ if ( !$file ) {
+ print("Can't open file $fullName for writing\n");
+ return;
+ }
+
+ fwrite( $file, $text );
+ fclose( $file );
+ }
+
+ /** Set up globals required for parsing */
+ function setupGlobals( $depth = NULL ) {
+ global $wgUser, $wgTitle, $wgMakeDumpLinks, $wgStylePath, $wgArticlePath;
+ global $wgUploadPath, $wgLogo, $wgMaxCredits, $wgSharedUploadPath;
+ global $wgHideInterlanguageLinks, $wgUploadDirectory, $wgThumbnailScriptPath;
+ global $wgSharedThumbnailScriptPath, $wgEnableParserCache;
+
+ static $oldLogo = NULL;
+
+ if ( is_null( $depth ) ) {
+ $wgMakeDumpLinks = $this->depth;
+ } else {
+ $wgMakeDumpLinks = $depth;
+ }
+
+ if ( $this->alternateScriptPath ) {
+ if ( $wgMakeDumpLinks == 0 ) {
+ $wgScriptPath = '.';
+ } else {
+ $wgScriptPath = '..' . str_repeat( '/..', $wgMakeDumpLinks - 1 );
+ }
+ } else {
+ $wgScriptPath = '..' . str_repeat( '/..', $wgMakeDumpLinks );
+ }
+
+ $wgArticlePath = str_repeat( '../', $wgMakeDumpLinks ) . '$1';
+
+ # Logo image
+ # Allow for repeated setup
+ if ( !is_null( $oldLogo ) ) {
+ $wgLogo = $oldLogo;
+ } else {
+ $oldLogo = $wgLogo;
+ }
+
+ if ( strpos( $wgLogo, $wgUploadPath ) === 0 ) {
+ # If it's in the upload directory, rewrite it to the new upload directory
+ $wgLogo = "$wgScriptPath/{$this->imageRel}/" . substr( $wgLogo, strlen( $wgUploadPath ) + 1 );
+ } elseif ( $wgLogo{0} == '/' ) {
+ # This is basically heuristic
+ # Rewrite an absolute logo path to one relative to the the script path
+ $wgLogo = $wgScriptPath . $wgLogo;
+ }
+
+ $wgScriptPath = substr($wgScriptPath,3);
+
+ $wgStylePath = $wgScriptPath ? "$wgScriptPath/" : '';
+ $wgUploadPath = "$wgScriptPath/{$this->imageRel}";
+ $wgSharedUploadPath = "$wgUploadPath/shared";
+ $wgMaxCredits = -1;
+ $wgHideInterlangageLinks = !$this->interwiki;
+ $wgThumbnailScriptPath = $wgSharedThumbnailScriptPath = false;
+ $wgEnableParserCache = false;
+
+ $wgUser = new User;
+ $wgUser->setOption( 'skin', 'htmldump' );
+ $wgUser->setOption( 'editsection', 0 );
+
+ $this->sharedStaticPath = "$wgUploadDirectory/shared";
+
+ }
+
+ /** Reads the content of a title object, executes the skin and captures the result */
+ function getArticleHTML( &$title ) {
+ global $wgOut, $wgTitle, $wgArticle, $wgUser, $wgUseCategoryMagic;
+
+ $wgOut = new OutputPage;
+ $wgOut->setParserOptions( new ParserOptions );
+
+ $wgTitle = $title;
+ if ( is_null( $wgTitle ) ) {
+ return false;
+ }
+
+ $ns = $wgTitle->getNamespace();
+ if ( $ns == NS_SPECIAL ) {
+ SpecialPage::executePath( $wgTitle );
+ } else {
+ if ( $ns == NS_IMAGE ) {
+ $wgArticle = new ImagePage( $wgTitle );
+ } elseif ( $wgUseCategoryMagic && $ns == NS_CATEGORY ) {
+ $wgArticle = new CategoryPage( $wgTitle );
+ } else {
+ $wgArticle = new Article( $wgTitle );
+ }
+ $wgArticle->view();
+ }
+
+ $sk =& $wgUser->getSkin();
+ ob_start();
+ $sk->outputPage( $wgOut );
+ $text = ob_get_contents();
+ ob_end_clean();
+
+ $text = str_replace(array('/:/','%7E'), array('/_/','_'), $text);
+
+ return $text;
+ }
+
+ /** Returns image paths used in an XHTML document */
+ function findImages( $text ) {
+ global $wgOutputEncoding, $wgDumpImages;
+ $parser = xml_parser_create( $wgOutputEncoding );
+ xml_set_element_handler( $parser, 'wfDumpStartTagHandler', 'wfDumpEndTagHandler' );
+
+ $wgDumpImages = array();
+ xml_parse( $parser, $text );
+ xml_parser_free( $parser );
+
+ return $wgDumpImages;
+ }
+
+ /**
+ * Copy images (or create symlinks) from commons to a static directory.
+ * This is necessary even if you intend to distribute all of commons, because
+ * the directory contents is used to work out which image description pages
+ * are needed.
+ */
+ function copyImages( $images ) {
+ global $wiki_dir, $output_dir;
+ global $wgSharedUploadPath, $wgSharedUploadDirectory;
+ # Find shared uploads and copy them into the static directory
+ $sharedPathLength = strlen( $wgSharedUploadPath );
+ foreach ( $images as $image => $dummy ) {
+ # Is it shared?
+ if ( strpos($image, 'upload') > 0) {
+ # Reconstruct full filename
+ $rel = substr( $image, strpos($image,'upload')+7 ); // +1 for slash
+ $sourceLoc = $wiki_dir."images/$rel";
+ $staticLoc = "$output_dir/upload/$rel";
+// print "Copying $sourceLoc to $staticLoc\n";
+
+ # Copy to static directory
+ if ( !file_exists( $staticLoc ) ) {
+ wfMkdirParents( dirname( $staticLoc ), 0755 );
+ //if ( function_exists( 'symlink' ) && !$this->forceCopy ) {
+ // symlink( $sourceLoc, $staticLoc );
+ //} else {
+ copy( $sourceLoc, $staticLoc );
+ //}
+ }
+
+ if ( substr( $rel, 0, 6 ) == 'thumb/' ) {
+ # That was a thumbnail
+ # We will also copy the real image
+ $parts = explode( '/', $rel );
+ $rel = "{$parts[1]}/{$parts[2]}/{$parts[3]}";
+ $sourceLoc = $wiki_dir."images/$rel";
+ $staticLoc = "$output_dir/upload/$rel";
+# print "Copying $sourceLoc to $staticLoc\n";
+ if ( !file_exists( $staticLoc ) ) {
+ wfMkdirParents( dirname( $staticLoc ), 0755 );
+ copy( $sourceLoc, $staticLoc );
+ }
+ }
+ }
+ }
+ }
+}
+
+/** XML parser callback */
+function wfDumpStartTagHandler( $parser, $name, $attribs ) {
+ global $wgDumpImages;
+
+ if ( $name == 'IMG' && isset( $attribs['SRC'] ) ) {
+ $wgDumpImages[$attribs['SRC']] = true;
+ }
+}
+
+/** XML parser callback */
+function wfDumpEndTagHandler( $parser, $name ) {}
+
+# vim: syn=php
+?>
diff --git a/buildscripts/wikibuilder/dumpHTML.php b/buildscripts/wikibuilder/dumpHTML.php
new file mode 100644
index 00000000..d34e53ed
--- /dev/null
+++ b/buildscripts/wikibuilder/dumpHTML.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * @todo document
+ * @package MediaWiki
+ * @subpackage Maintenance
+ */
+
+/**
+ * Usage:
+ * php dumpHTML.php [options...]
+ *
+ * -d <dest> destination directory
+ * -s <start> start ID
+ * -e <end> end ID
+ * --images only do image description pages
+ * --categories only do category pages
+ * --special only do miscellaneous stuff
+ * --force-copy copy commons instead of symlink, needed for Wikimedia
+ * --interlang allow interlanguage links
+ */
+
+
+$optionsWithArgs = array( 's', 'd', 'e' );
+
+require_once($wiki_dir. "/maintenance/commandLine.inc" );
+require_once(dirname(__FILE__)."/dumpHTML.inc" );
+
+class DummyUser extends User
+{
+ function getSkin()
+ {
+ require_once(dirname(__FILE__).'/DumpSkin.php' );
+ $this->mSkin =& new DumpSkin;
+ return $this->mSkin;
+ }
+}
+
+class DumpTitle extends Title
+{
+ function getHashedDirectory()
+ {
+ return strtr(parent::getHashedDirectory(), '~:', '__');
+ }
+}
+
+error_reporting( E_ALL & (~E_NOTICE) );
+define( 'CHUNK_SIZE', 50 );
+
+if ( !empty( $options['s'] ) ) {
+ $start = $options['s'];
+} else {
+ $start = 1280;
+}
+
+if ( !empty( $options['e'] ) ) {
+ $end = $options['e'];
+} else {
+ $dbr =& wfGetDB( DB_SLAVE );
+ $end = $dbr->selectField( 'page', 'max(page_id)', false );
+}
+
+if ( !empty( $options['d'] ) ) {
+ $dest = $options['d'];
+} else {
+ $dest = $output_dir;
+}
+
+class DumpHTMLSkined extends DumpHTML
+{
+ function setupGlobals( $depth = NULL )
+ {
+ parent::setupGlobals($depth);
+ global $wgUser,$wgServer,$wiki_url;
+ $wgUser = new DummyUser;
+ $wgServer = $wiki_url;
+ }
+}
+
+$d = new DumpHTMLSkined( array(
+ 'dest' => $dest,
+ 'forceCopy' => $options['force-copy'],
+ 'alternateScriptPath' => $options['interlang'],
+ 'interwiki' => $options['interlang'],
+));
+
+
+if ( $options['special'] ) {
+ $d->doSpecials();
+} elseif ( $options['images'] ) {
+ $d->doImageDescriptions();
+} elseif ( $options['categories'] ) {
+ $d->doCategories();
+} else {
+ print("Creating static HTML dump in directory $dest. \n".
+ "Starting from page_id $start of $end.\n");
+ $d->doArticles( $start, $end );
+ $d->doImageDescriptions();
+ $d->doCategories();
+ $d->doMainPage();
+}
+
+?> \ No newline at end of file
diff --git a/buildscripts/wikibuilder/external.png b/buildscripts/wikibuilder/external.png
new file mode 100644
index 00000000..419c06fb
--- /dev/null
+++ b/buildscripts/wikibuilder/external.png
Binary files differ
diff --git a/buildscripts/wikibuilder/main.css b/buildscripts/wikibuilder/main.css
new file mode 100644
index 00000000..c237dfc1
--- /dev/null
+++ b/buildscripts/wikibuilder/main.css
@@ -0,0 +1,501 @@
+/*
+-----------------------------------------------------
+FraternityManuals.org MediaWiki 'monobook' style sheet for CSS2-capable browsers
+FileName: main.css
+Version: 2005.04.06
+Author: jasonpearce.com
+-----------------------------------------------------
+*/
+
+/*
+-----------------------------------------------------
+FraternityManuals.org basic tags rules CSS file for screen media
+FileName: browserdefaults_compact.css
+Version: 2005.04.06
+Author: jasonpearce.com
+-----------------------------------------------------
+*/
+
+@namespace url(http://www.w3.org/1999/xhtml);/* set default namespace to HTML */
+
+/* zero padding and margins */
+* {margin:0;padding:0;}
+
+/* set font size */
+
+/* blocks */
+address,blockquote,body,center,dd,dir,div,dl,dt,frameset,h1,h2,h3,h4,h5,h6,hr,html,isindex,listing,map,marquee,menu,multicol,ol,p,plaintext,pre,ul,xmp {display:block;}
+blockquote {margin:1em 40px;}
+blockquote[type=cite] {border-color:blue;border-left:solid;border-width:thin;margin:1em 0px;padding-left:1em;}
+listing {font-size:medium;margin:1em 0;white-space:pre;}
+p,dl,multicol {margin:1em 0;}
+plaintext,xmp,pre {margin:1em 0;white-space:pre;}
+
+/* headings */
+h1,h2,h3,h4,h5,h6 {font-weight:bold;}
+h1 {font-size:1.75em;}
+h2 {font-size:1.5em;}
+h3 {font-size:1.33em;}
+h4 {font-size:1.2em;}
+h5 {font-size:1em;}
+h6 {font-size:0.85em;}
+h1,h2,h3,h4,h5,h6 {margin:1.5em 0 0.25em 0;}
+h1 {margin-top:0;}
+
+/* link pseudo-classes */
+a:link {text-decoration:none;}
+a:visited {text-decoration:none;}
+a:hover {text-decoration:underline;}
+a:active {text-decoration:none;}
+
+/* tables */
+table {border-collapse:separate;border-spacing:2px;display:table;margin-bottom:0;margin-top:0;text-indent:0;}
+table[align="left"] {float:left;}
+table[align="right"] {float:right;text-align:start;}
+table[rules] {border-collapse:collapse;}
+caption {display:table-caption;text-align:center;}
+table[align="center"] > caption {margin-left:auto;margin-right:auto;}
+table[align="center"] > caption[align="left"] {margin-right:0;}
+table[align="center"] > caption[align="right"] {margin-left:0;}
+tr {display:table-row;vertical-align:inherit;}
+col {display:table-column;}
+colgroup {display:table-column-group;}
+tbody {display:table-row-group;vertical-align:middle;}
+thead {display:table-header-group;vertical-align:middle;}
+tfoot {display:table-footer-group;vertical-align:middle;}
+
+/* for XHTML tables without tbody */
+table > tr {vertical-align:middle;}
+td { display:table-cell;padding:1px;text-align:inherit; vertical-align:inherit;}
+th {display:table-cell;font-weight:bold;padding:1px;vertical-align:inherit;}
+
+/* inlines */
+b,strong {font-weight:bolder;}
+big {font-size:larger;}
+blink {text-decoration:blink;}
+i,address,cite,dfn,em,var {font-style:italic;}
+nobr {white-space:nowrap;}
+q:after {content:close-quote;}
+q:before {content:open-quote;}
+s,strike,del {text-decoration:line-through;}
+small {font-size:smaller;}
+sub {font-size:smaller;line-height:normal;vertical-align:sub;}
+sup {font-size:smaller;line-height:normal;vertical-align:super;}
+u,ins {text-decoration:underline;}
+
+/* titles */
+abbr[title],acronym[title] {border-bottom:dotted 1px;}
+
+/* lists */
+ul,menu,dir {list-style-type:disc;margin:1em 2em;}
+ol {list-style-type:decimal;margin:1em 2em;}
+li {display:list-item;}
+
+/* nested lists have no top/bottom margins */
+ul ul,ul ol,ul dir,ul menu,ul dl,ol ul,ol ol,ol dir,ol menu,ol dl,dir ul, dir ol, dir dir, dir menu, dir dl,menu ul,menu ol,menu dir,menu menu,menu dl,dl ul,dl ol,dl dir,dl menu,dl dl {margin-top:0;margin-bottom:0;}
+
+/* 2 deep unordered lists use a circle */
+ol ul,ul ul,menu ul,dir ul,ol menu,ul menu,menu menu,dir menu,ol dir, ul dir, menu dir, dir dir {list-style-type:circle;}
+
+/* 3 deep (or more) unordered lists use a square */
+ol ol ul, ol ul ul, ol menu ul, ol dir ul,ol ol menu,ol ul menu,ol menu menu,ol dir menu,ol ol dir, ol ul dir, ol menu dir, ol dir dir,ul ol ul, ul ul ul, ul menu ul, ul dir ul,ul ol menu,ul ul menu,ul menu menu,ul dir menu,ul ol dir, ul ul dir, ul menu dir, ul dir dir,menu ol ul,menu ul ul,menu menu ul,menu dir ul,menu ol menu,menu ul menu,menu menu menu,menu dir menu,menu ol dir, menu ul dir, menu menu dir, menu dir dir,dir ol ul, dir ul ul, dir menu ul, dir dir ul,dir ol menu, dir ul menu, dir menu menu, dir dir menu,dir ol dir,dir ul dir,dir menu dir,dir dir dir {list-style-type:square;}
+
+/* leafs */
+hr {border:1px;height:2px;margin:0.5em auto 0.5em auto;}
+img[usemap],object[usemap] {color:blue;cursor:pointer;}
+iframe {border:2px inset;}
+
+/* hidden elements */
+area,base,basefont,head,meta,noembed,noframes,noscript,param,script,style,title { display:none;}
+
+/* bidirectionality elements */
+*[dir="ltr"] {direction:ltr;unicode-bidi:embed;}
+*[dir="rtl"] {direction:rtl;unicode-bidi:embed;}
+address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,frameset,h1,h2,h3,h4,h5,h6,iframe,noscript,noframes,object,ol,p,ul,applet,center,dir,hr,menu,pre,li,table,tr,thead,tbody,tfoot,col,colgroup,td,th,caption {unicode-bidi:embed;}
+bdo[dir="ltr"] {direction:ltr;unicode-bidi:bidi-override;}
+bdo[dir="rtl"] {direction:rtl;unicode-bidi:bidi-override;}
+
+/* print settings */
+@media print {
+ @page {margin:10%;}
+ blockquote,fieldset,pre {page-break-inside:avoid;}
+ h1,h2,h3,h4,h5,h6 {page-break-after:avoid;page-break-inside:avoid;}
+ ul,ol,dl {page-break-before:avoid;}
+}
+
+/* speech settings */
+@media speech {
+ a:active {voice-family:betty,female;pitch-range:80;pitch:x-high;}
+ a:link {voice-family:harry,male;}
+ a:visited {voice-family:betty,female;}
+ b {pitch:medium;pitch-range:60;stress:90;richness:90;}
+ dfn {pitch:high;pitch-range:60;stress:60;}
+ dt {stress:80;}
+ em {pitch:medium;pitch-range:60;stress:60;richness:50;}
+ h1 {pitch:x-low;pitch-range:90;}
+ h1,h2,h3,h4,h5,h6 {voice-family:paul,male;stress:20;richness:90;}
+ h2 {pitch:x-low;pitch-range:80;}
+ h3 {pitch:low;pitch-range:70;}
+ h4 {pitch:medium;pitch-range:60;}
+ h5 {pitch:medium;pitch-range:50;}
+ h6 {pitch:medium;pitch-range:40;}
+ i {pitch:medium;pitch-range:60;stress:60;richness:50;}
+ li,dt,dd {pitch:medium;richness:60;}
+ pre,code,tt {pitch:medium;pitch-range:0;stress:0;richness:80;}
+ s,strike {richness:0;}
+ strong {pitch:medium;pitch-range:60;stress:90;richness:90;}
+ u {richness:0;}
+}
+
+
+/* Typography & Colors -----------------------------------------------*/
+body {
+ background-color: #ffffff; /* white */
+ color: #333; /* dark grey */
+ font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif;
+ }
+img { border: 0px;}
+
+#titleBar {
+ border-bottom: 1px solid #DBDBDB; /* light grey */
+ }
+
+#content {
+ font-size: 10pt;
+ line-height: 1.5em;
+ }
+
+code {
+ font: 11pt 'Courier New', Courier, Fixed;
+ background-color: #f9f9f9;
+}
+pre {
+ padding: 0.5em;
+ color: Black;
+ background-color: #EEEEEE;
+ line-height: 1.1em;
+ font-size: 11pt;
+}
+
+acronym, abbr, span.caps {
+ font-size: 0.9em;
+ letter-spacing: .07em;
+ }
+
+#column-one {
+ font-size: 10pt;
+ line-height: 1.2em;
+ }
+
+#column-one {
+ color: #444444;
+ background-color: #F0F0F0;
+ }
+
+#toc { /* table of contents */
+ background: #FFF6EB; /* very light orange */
+ border: 1px solid #FEBA63; /* light orange */
+ }
+
+#toctitle {
+ background: #FEBA63; /* light orange */
+ color: #3F290C; /* very dark orange */
+ }
+
+#footer {
+ border-top: 1px solid silver;
+ color: #999999;
+ }
+
+
+/* Links -------------------------------------------------------------*/
+a {color: #3366CC;} /* red */
+a:hover {color: #3366CC;} /* red */
+
+p a:visited {color: #3366CC;} /* red */
+#content a.new {color: #DE0000;} /* green */
+
+#column-one a {color: #2F7300;} /* green */
+#column-one a:hover {color: #183A00;} /* dark green */
+#column-one .selected a {
+ color: #183A00; /* dark green bold */
+ font-weight: bolder;
+ }
+
+#toc a {color: #2153B0;} /* blue */
+#toc a:hover {color: #173A7B;} /* dark blue */
+#toc p a:visited {color: #2153B0;} /* blue */
+
+#footer a {color: #999999;}
+#footer a:hover {color: #173A7B;} /* dark blue */
+
+/* LINK ICONS
+** keep the whitespace in front of the ^=, hides rule from konqueror
+** this is css3, the validator doesn't like it when validating as css2
+*/
+#bodyContent a[href ^="http://"], #bodyContent a[href ^="gopher://"] {
+ background: url("external.png") center right no-repeat;
+ padding-right: 13px;
+ }
+
+#bodyContent a[href ^="https://"], .link-https {
+ background: url("lock_icon.gif") center right no-repeat;
+ padding-right: 16px;
+ }
+
+#bodyContent a[href ^="mailto:"], .link-mailto {
+ background: url("mail_icon.gif") center right no-repeat;
+ padding-right: 18px;
+ }
+
+#bodyContent a[href ^="news://"] {
+ background: url("news_icon.png") center right no-repeat;
+ padding-right: 18px;
+ }
+
+#bodyContent a[href ^="ftp://"], .link-ftp {
+ background: url("file_icon.gif") center right no-repeat;
+ padding-right: 18px;
+ }
+
+#bodyContent a[href ^="irc://"], .link-irc {
+ background: url("discussionitem_icon.gif") center right no-repeat;
+ padding-right: 18px;
+}
+
+
+
+
+/* Structure & Frame -------------------------------------------------*/
+body {
+ text-align: center;
+ font-size:10pt;
+ }
+
+#titleBar {
+ height: 100px;
+ text-align: left;
+ width: 100%;
+ }
+
+#globalWrapper {
+ margin: 20px;
+ text-align: left;
+ }
+
+
+/* Headers -----------------------------------------------------------*/
+h1, h2, h3, h4 {font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Arial, Sans-Serif;}
+h1, h2 {border-bottom: 1px solid silver; line-height: 1.1em; padding-bottom: 0.2em;}
+
+.firstHeading {border-bottom-style: solid; font-size: 2em;}
+.editsection {margin-top: 1em;}
+
+.portlet h5 { /* blocks within #column-one */
+ border-top: 1px solid #eeeeee;
+ margin-top: 0;
+ padding-top: 0.25em;
+ }
+
+
+/* Images ------------------------------------------------------------*/
+#titleBar {
+ background-image: url('pradomantis.gif'); /* blue and white background */
+ background-repeat: no-repeat;
+ background-position: top right;
+ }
+
+#titleBar img {
+ margin-left: 2.5%;
+ }
+
+#p-poweredby img {
+ border: 0;
+ clear: both;
+ float: right;
+ margin: 2px 0;
+ }
+
+
+/* Lists -------------------------------------------------------------*/
+.portlet ul {
+ margin-bottom: 2em;
+ }
+
+.portlet li {
+ margin: 0.5em 0;
+ }
+
+/* Special stylized non-IE bullets
+ Does not work in Internet Explorer, which merely default to normal bullets. */
+html>body .portlet ul {
+ list-style: none;
+ margin-left: 0px;
+ padding: 0 0 0 30px;
+ padding-left: 10px;
+ text-indent: -10px;
+ }
+
+html>body .portlet li {
+ margin-left: 10px;
+ }
+
+html>body .portlet ul li:before {
+ content: "\00BB \0020";
+ }
+
+
+/* Form Elements -----------------------------------------------------*/
+.portlet #searchform {
+ margin-left: 10px;
+ margin-bottom: 2em;
+ }
+
+.portlet #searchform input {
+ margin: 0.15em 0;
+ }
+
+
+/* Various Tags & Classes --------------------------------------------*/
+#siteSub, .urlexpansion, .printfooter {
+ display: none;
+ }
+
+.visualClear {
+ clear: both;
+ }
+
+/* BEGIN user notifications */
+.usermessage {
+ background-color: #ffce7b; /* yellow */
+ border: 1px solid #ffa500; /* orange */
+ color: Black;
+ font-weight: bold;
+ margin: 2em 0em 1em 0em;
+ padding: 0.5em 1em;
+ vertical-align: middle;
+ }
+
+#siteNotice {
+ font-size: 95%;
+ padding: 0 0.9em 0 0.9em;
+ text-align: center;
+ }
+
+#siteNotice p {margin: 0; padding: 0;}
+
+.error {color: red; font-size: larger;}
+
+#catlinks {
+ background-color: #F2F6FF; /* very light blue */
+ border: 1px solid #CBDDFF; /* light blue */
+ clear: both;
+ margin: 1em 0;
+ }
+
+#catlinks p {margin: 0.5em;}
+/* END user notifications */
+
+
+
+/* Content -----------------------------------------------------------*/
+/* BEGIN Table of Contents */
+#toc {
+ float: right;
+ margin: 0 0 1em 1em;
+ }
+#toc td {padding: 0.5em;}
+#toc .tocindent {margin-left: 1em;}
+#toc .tocline {margin-bottom: 0px;}
+#toc p {margin: 0}
+#toc .editsection {margin-top: 0.7em;}
+/* END Table of Contents */
+
+/* BEGIN Page history styling */
+.autocomment {color: gray;}
+#pagehistory span.user {margin-left: 1.4em; margin-right: 0.4em;}
+#pagehistory span.minor {font-weight: bold;}
+#pagehistory input {margin: 0.2em;}
+#pagehistory li {border: 1px solid #ffffff; margin-top: 1px; margin-bottom: 1px;}
+#pagehistory li.selected {
+ background-color: #CBDDFF; /* light blue */
+ border:1px dashed #FDA32F; /* orange */
+ }
+/* END Page history styling */
+
+/* BEGIN Diff rendering */
+table.diff {background: #FEFEFE; border: 1px solid #cccccc; padding: 0.5em}
+table.diff td {vertical-align: top;}
+td.diff-otitle a, td.diff-ntitle a, td.diff-otitle a:visited, td.diff-ntitle a:visited {color: #2153B0;}
+td.diff-otitle a:hover, td.diff-ntitle a:hover {text-decoration: underline;}
+td.diff-otitle {}
+td.diff-ntitle {}
+td.diff-addedline {background:#F2F6FF;}
+td.diff-addedline span.diffchange {
+ background: #CDDEFF;
+ border: 1px dashed #676F80;
+ color: green;
+ font-weight: bold;
+ }
+td.diff-deletedline {background:#FFF9F2;}
+td.diff-deletedline span.diffchange {
+ background: #FFE9CB;
+ border: 1px dashed #B3A38E;
+ color: red;
+ font-weight: bold;
+ text-decoration: line-through;
+ }
+td.diff-context {background:#eeeeee;}
+.newpage {color: green; font-weight: bolder;}
+/* END Diff rendering */
+
+/* BEGIN forms */
+fieldset {
+ background: #FAFCFF;
+ border: 1px solid #CBDDFF;
+ margin: 1em;
+ padding: 0.5em 1em;
+ }
+
+fieldset div {
+ margin: 0.25em 0;
+ }
+
+fieldset input {
+ margin: 0 0.5em;
+ }
+
+legend {
+ color: #2153B0;
+ font-size: 1.25em;
+ font-weight: bolder;
+ padding: 0.2em 0.5em;
+ }
+/* END forms */
+
+
+
+
+/* Footer ------------------------------------------------------------*/
+#footer ul {
+ list-style: none;
+ margin: 0;
+ }
+
+#footer ul li {
+ margin: 0.1em;
+ margin-right: 1em;
+ }
+
+#f-lastmod {}
+#f-viewcount {display: none;}
+#f-copyright {}
+#f-about {float: left;}
+#f-disclaimer {float: left;}
+#f-developedby {float: left;}
+
+a.external
+{
+ background: url("external.png") center right no-repeat;
+ padding-right: 13px;
+} \ No newline at end of file