Difference between revisions of "Extension:Wikiskin.php"

From Organic Design wiki
m
(read skin and replace magic words)
Line 6: Line 6:
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
 
# - Author: http://www.organicdesign.co.nz/nad
 
# - Author: http://www.organicdesign.co.nz/nad
 +
 +
$wgWikiSkin = isset($_REQUEST['skin']) ? $_REQUEST['skin'] : 'WikiSkin';
  
 
$wgWikiSkinMagic = array('CURRENTUSER','LOGO','TEXT','SEARCH','ACTIONS','SITENOTICE','SUBTITLE','INFO','CATLINKS','FOOTER');
 
$wgWikiSkinMagic = array('CURRENTUSER','LOGO','TEXT','SEARCH','ACTIONS','SITENOTICE','SUBTITLE','INFO','CATLINKS','FOOTER');
 
 
$wgExtensionFunctions[]                    = 'wfSetupWikiSkin';
 
$wgExtensionFunctions[]                    = 'wfSetupWikiSkin';
 
$wgHooks['MagicWordMagicWords'][]          = 'wfWikiSkinMagicWord';
 
$wgHooks['MagicWordMagicWords'][]          = 'wfWikiSkinMagicWord';
Line 14: Line 15:
 
$wgHooks['LanguageGetMagic'][]            = 'wfWikiSkinWordLang';
 
$wgHooks['LanguageGetMagic'][]            = 'wfWikiSkinWordLang';
 
$wgHooks['ParserGetVariableValueSwitch'][] = 'wfGetWikiSkinMagicWord';
 
$wgHooks['ParserGetVariableValueSwitch'][] = 'wfGetWikiSkinMagicWord';
 
  
 
function wfWikiSkinMagicWord(&$magicWords) {
 
function wfWikiSkinMagicWord(&$magicWords) {
Line 76: Line 76:
 
class WikiSkinTemplate extends QuickTemplate {
 
class WikiSkinTemplate extends QuickTemplate {
 
function execute() {
 
function execute() {
 +
 +
# Build the HTML, HEAD and BODY elements and send to output
 
wfSuppressWarnings();
 
wfSuppressWarnings();
 
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Line 116: Line 118:
 
  class="<?php $this->text('nsclass') ?> <?php $this->text('dir') ?>">
 
  class="<?php $this->text('nsclass') ?> <?php $this->text('dir') ?>">
  
$sitenotice = $this->data['sitenotice'] ? '<div id="siteNotice">'.$this->html('sitenotice').'</div>' : '';
+
<?php
$subtitle   = '<h3 id="siteSub">'.$this->msg('tagline').'</h3><div id="contentSub">'.$this->html('subtitle').'</div>';
+
# Build list of special fields and their content
$info       = ($this->data['undelete'] ? '<div id="contentSub2">'.$this->html('undelete').'</div>')
+
$replace = array(
            . ($this->data['newtalk'] ? '<div class="usermessage">'.$this->html('newtalk').'</div>')
+
'SITENOTICE' => $this->data['sitenotice'] ? '<div id="siteNotice">'.$this->html('sitenotice').'</div>' : '',
            . ($this->data['showjumplinks'] ? '<div id="jump-to-nav">'.$this->msg('jumpto')
+
'SUBTITLE'   => '<h3 id="siteSub">'.$this->msg('tagline').'</h3><div id="contentSub">'.$this->html('subtitle').'</div>',
              .'<a href="#column-one">'.$this->msg('jumptonavigation').'</a>'
+
'INFO'       => ($this->data['undelete'] ? '<div id="contentSub2">'.$this->html('undelete').'</div>')
              .', <a href="#searchInput">'.$this->msg('jumptosearch').'</a></div>');
+
                        .($this->data['newtalk'] ? '<div class="usermessage">'.$this->html('newtalk').'</div>')
$text = $this->html('bodytext');
+
                        .($this->data['showjumplinks'] ? '<div id="jump-to-nav">'.$this->msg('jumpto')
$catlinks   = $this->html('catlinks')   ? '<div id="catlinks">'.$this->html('catlinks').'</div>' : '';
+
                        .'<a href="#column-one">'.$this->msg('jumptonavigation').'</a>'
 +
                        .', <a href="#searchInput">'.$this->msg('jumptosearch').'</a></div>'),
 +
'TEXT'      => $this->html('bodytext'),
 +
'CATLINKS'   => $this->html('catlinks') ? '<div id="catlinks">'.$this->html('catlinks').'</div>' : ''
 +
);
 +
 
 +
# Read and parse the skin article
 +
global $wgUser,$wgTitle,$wgParser,$wgWikiSkin;
 +
$skin = new Article(Title::newFromText($wgWikiSkin));
 +
$opt = ParserOptions::newFromUser($wgUser);
 +
$content = $wgParser->parse($skin->fetchContent(0,false,false),$wgTitle,$opt,true,true);
 +
 
 +
# Replace all the fields and send to output
 +
echo preg_replace('/\\({4}WikiSkin:(.+?)\\){4}/ie','$replace["$1"]',$content->getText());
 +
?>
  
 
<?php $this->html('reporttime') ?>
 
<?php $this->html('reporttime') ?>
Line 130: Line 146:
 
<?php
 
<?php
 
wfRestoreWarnings();
 
wfRestoreWarnings();
 
  
 
}
 
}

Revision as of 07:45, 5 April 2007

<?

  1. Extension:Livelets
  2. - Uses a wikitext article for the skin instead of a PHP file. Special items like search box and login link use magic words
  3. - Version 0.1 (2007-04-05)
  4. - See http://www.mediawiki.org/wiki/Extension:WikiSkin for installation and usage details
  5. - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
  6. - Author: http://www.organicdesign.co.nz/nad

$wgWikiSkin = isset($_REQUEST['skin']) ? $_REQUEST['skin'] : 'WikiSkin';

$wgWikiSkinMagic = array('CURRENTUSER','LOGO','TEXT','SEARCH','ACTIONS','SITENOTICE','SUBTITLE','INFO','CATLINKS','FOOTER'); $wgExtensionFunctions[] = 'wfSetupWikiSkin'; $wgHooks['MagicWordMagicWords'][] = 'wfWikiSkinMagicWord'; $wgHooks['MagicWordwgVariableIDs'][] = 'wfWikiSkinMagicWordID'; $wgHooks['LanguageGetMagic'][] = 'wfWikiSkinWordLang'; $wgHooks['ParserGetVariableValueSwitch'][] = 'wfGetWikiSkinMagicWord';

function wfWikiSkinMagicWord(&$magicWords) { global $wgWikiSkinMagic; foreach($wgWikiSkinMagic as $magic) $magicWords[] = "MAG_$magic"; return true; }

function wfWikiSkinMagicWordID(&$magicWords) { global $wgWikiSkinMagic; foreach($wgWikiSkinMagic as $magic) $magicWords[] = constant("MAG_$magic"); return true; }

function wfWikiSkinWordLang(&$magicWords, $langCode = 0) { global $wgWikiSkinMagic; foreach($wgWikiSkinMagic as $magic) $magicWords[constant("MAG_$magic")] = array(0,$magic); return true; }

function wfGetWikiSkinMagicWord(&$this,&$cache,&$index,&$ret) { global $wgMagicWordsEn; switch ($index) {

case MAG_CURRENTUSER: $ret = $GLOBALS['wgUser']->mName; break;

case MAG_LOGO: $ret = $GLOBALS['wgLogo']; break;

# These ones are all replaced by a token to be filled by skin when rendering page case MAG_TEXT: case MAG_SEARCH: case MAG_ACTIONS: case MAG_SITENOTICE: case MAG_SUBTITLE: case MAG_INFO: case MAG_CATLINKS: case MAG_FOOTER: $magic = $wgMagicWordsEn[$index]; $ret = "((((WikiSkin:$magic))))"; break; } return true; }

  1. Create skin class based on monobook which parses the skin article and embeds the content

class SkinWikiSkin extends SkinTemplate {

function initPage(&$out) { SkinTemplate::initPage($out); $this->skinname = 'wikiskin'; $this->stylename = 'wikiskin'; $this->template = 'WikiSkinTemplate'; }

}

class WikiSkinTemplate extends QuickTemplate { function execute() {

# Build the HTML, HEAD and BODY elements and send to output wfSuppressWarnings(); ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> text('lang') ?>" lang="text('lang') ?>" dir="text('dir') ?>"> html('headlinks') ?> <?php $this->text('pagetitle') ?> data['printable']) ) { ?>media="print" href="text('stylepath') ?>/common/commonPrint.css" /> data['jsvarurl' ]) { ?> data['pagecss' ]) { ?> data['usercss' ]) { ?> data['userjs' ]) { ?> data['userjsprev']) { ?> data['trackbackhtml']) print $this->data['trackbackhtml']; ?> html('headscripts') ?> data['body_ondblclick']) { ?>ondblclick="text('body_ondblclick') ?>" data['body_onload' ]) { ?>onload="text('body_onload') ?>" class="text('nsclass') ?> text('dir') ?>"> $this->data['sitenotice'] ? '

'.$this->html('sitenotice').'

' : '', 'SUBTITLE' => '

'.$this->msg('tagline').'

'.$this->html('subtitle').'

', 'INFO' => ($this->data['undelete'] ? '

'.$this->html('undelete').'

') .($this->data['newtalk'] ? '

'.$this->html('newtalk').'

') .($this->data['showjumplinks'] ? '

'), 'TEXT' => $this->html('bodytext'), 'CATLINKS' => $this->html('catlinks') ? '

' : '' ); # Read and parse the skin article global $wgUser,$wgTitle,$wgParser,$wgWikiSkin; $skin = new Article(Title::newFromText($wgWikiSkin)); $opt = ParserOptions::newFromUser($wgUser); $content = $wgParser->parse($skin->fetchContent(0,false,false),$wgTitle,$opt,true,true); # Replace all the fields and send to output echo preg_replace('/\\({4}WikiSkin:(.+?)\\){4}/ie','$replace["$1"]',$content->getText()); ?> html('reporttime') ?> <?php wfRestoreWarnings();

}

}

  1. Make the new skin current

function wfSetupWikiSkin() { global $wgUser; $wgUser->setOption('skin','WikiSkin'); $wgUser->mSkin =& new SkinWikiSkin; }

?>