Utilizador:Raylton P. Sousa/AutoNav
Aspeto
Favor não postar nada sobre isso para a comunidade, pois esse código é bastante instável e não passa de um esboço. Logo, ainda não está maduro o suficiente para ser submetido a qualquer julgamento.
Código PHP
[editar | editar código-fonte]<?php
/**
* This extension defines navigation in subpages.
*
* Defines the following functions:
* - PREVPAGENAME (get prev page)
* - NEXTPAGENAME (get next page)
* @addtogroup Extensions
* @author Raylton P. Sousa <raylton.sousa@gmail.com>
* @license GNU General Public License 3.0 or later
*/
if ( !defined( 'MEDIAWIKI' ) ) {
die( 'This file is a MediaWiki extension, it is not a valid entry point' );
}
/**** extension basics ****/
$wgExtensionCredits['parserhook'][] = array(
'name' => 'AutoNav',
'version' => AutoNavFunctions::VERSION,
'author' => 'Raylton P. Sousa & Helder.wiki',
'url' => 'http://www.mediawiki.org/wiki/Extension:AutoNav',
'description' => 'Automatic navigation.',
);
/**** Register magic words ****/
$wgExtensionFunctions[] = 'AutoNavFunctions::register';
define('MAG_PREVPAGENAME', 'magicautonavcustomvar0');
define('MAG_NEXTPAGENAME', 'magicautonavcustomvar1');
$wgHooks['LanguageGetMagic'][] = 'efAutoNavLanguageGetMagic';
function efAutoNavLanguageGetMagic( &$magicWords, $langCode = "en" ) {
switch ( $langCode ) {
default:
# PREVPAGENAME
$magicWords[MAG_PREVPAGENAME] = array ( 0, 'PREVPAGENAME' );
$magicWords['prevpagename'] = $magicWords[MAG_PREVPAGENAME];
# NEXTPAGENAME
$magicWords[MAG_NEXTPAGENAME] = array ( 0, 'NEXTPAGENAME' );
$magicWords['nextpagename'] = $magicWords[MAG_NEXTPAGENAME];
}
return true;
}
$wgHooks['MagicWordwgVariableIDs'][] = 'wfMagicAutoNavDeclareVarIds';
function wfMagicAutoNavDeclareVarIds( &$aCustomVariableIds ) {
#aCustomVariableIds is where MediaWiki wants to store its
#list of custom variable ids. We oblige by adding ours:
$aCustomVariableIds[] = MAG_PREVPAGENAME;
$aCustomVariableIds[] = MAG_NEXTPAGENAME;
return true;
}
/**** All the AutoNavFunctions ****/
class AutoNavFunctions {
const VERSION = "0.1.1";
static function register( ) {
global $wgParser;
# optional SFH_NO_HASH to omit the hash from calls (e.g. {{int:...}}
# instead of {{#int:...}})
$wgParser->setFunctionHook( 'prevpagename', array( __CLASS__, 'prevpagename'), SFH_NO_HASH );
$wgParser->setFunctionHook( 'nextpagename', array( __CLASS__, 'nextpagename'), SFH_NO_HASH );
}
private static function newTitleObject ( &$parser, $title = '' ) {
if( $title )
$t = Title::newFromText( $title );
else //returns object of current page if nothing else is set:
$t = $parser->getTitle();
return $t;
}
/*
* Simplificação da função "parseCollectionLine" da extensão Collection
* (http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/Collection/Collection.body.php?view=markup)
*/
private static function parseCollectionLine( /* Sem uso por enquanto: &$collection, */ $line ) {
$line = trim( $line );
if ( substr( $line, 0, 1 ) == ':' ) { // article
$pageTitle = trim( substr( $line, 1 ) );
if ( preg_match( '/^\[\[:?(.*?)(\|(.*?))?\]\]$/', $pageTitle, $match ) ) {
$pageTitle = $match[1];
} elseif ( preg_match( '/^\[\{\{fullurl:(.*?)\|oldid=(.*?)\}\}\s+(.*?)\]$/', $pageTitle, $match ) ) {
$pageTitle = $match[1];
} else {
return null;
}
$pageTitle = Title::newFromText( $pageTitle );
if ( !$pageTitle ) {
return null;
}
$d = $pageTitle->getPrefixedText();
return $d;
}
return null;
}
/*
* Adaptação da função "loadCollection" da extensão Collection
* (http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/Collection/Collection.body.php?view=markup)
*/
private static function loadListFromCollection( $collectiontitle ) {
if ( is_null( $collectiontitle ) || !$collectiontitle->exists() ) {
return false;
}
$caps = array();
$collectionpage = new Article( $collectiontitle );
foreach ( preg_split( '/[\r\n]+/', $collectionpage->getContent() ) as $line ) {
$item = self::parseCollectionLine( $line );
if ( !is_null( $item ) ) {
$caps[] = $item;
}
}
return $caps;
}
private static function pageTitle( &$parser, $title = '', $n ) {
$t = AutoNavFunctions::newTitleObject( $parser, $title );
$title = Title::newFromText( 'Wikilivros:Livros/Introdução à programação' );
$cap = self::loadListFromCollection( $title );
$atual = array_search( $t, $cap );
if ( $atual === false ) {
return $t;
} else {
return $cap[ $atual + $n ];
}
}
static function prevpagename( &$parser, $title = '' ) {
$t = AutoNavFunctions::pageTitle( $parser, $title, -1);
if ( $t === null ) {
return AutoNavFunctions::newTitleObject( $parser, $title );
} else {
return $t;
}
}
static function nextpagename( &$parser, $title = '' ) {
$t = AutoNavFunctions::pageTitle( $parser, $title, +1 );
if ( $t === null ) {
return AutoNavFunctions::newTitleObject( $parser, $title );
} else {
return $t;
}
}
}
/**** All the AutoNavFunctions for use with MW Variables on the current page ****/
/** PREVPAGENAME **/
$wgHooks['ParserGetVariableValueSwitch'][] = 'wfMagicPrevPageNameAssignAValue';
function wfMagicPrevPageNameAssignAValue( &$parser, &$cache, &$magicWordId, &$ret ) {
if ( MAG_PREVPAGENAME == $magicWordId ) {
$ret = AutoNavFunctions::prevpagename( $parser );
}
return true;
}
/** NEXTPAGENAME **/
$wgHooks['ParserGetVariableValueSwitch'][] = 'wfMagicNextPageNameAssignAValue';
function wfMagicNextPageNameAssignAValue( &$parser, &$cache, &$magicWordId, &$ret ) {
if ( MAG_NEXTPAGENAME == $magicWordId ) {
$ret = AutoNavFunctions::nextpagename( $parser );
}
return true;
}
Código wiki para testar
[editar | editar código-fonte]{| class="wikitable" |- ! Parâmetro ! {{PREVPAGENAME:Parâmetro}} ! {{NEXTPAGENAME:Parâmetro}} |- | |{{PREVPAGENAME}} |{{NEXTPAGENAME}} |- |Introdução à programação/Definições sobre Lógica de Programação |{{PREVPAGENAME:Introdução à programação/Definições sobre Lógica de Programação}} |{{NEXTPAGENAME:Introdução à programação/Definições sobre Lógica de Programação}} |- |Introdução à programação/História da Programação |{{PREVPAGENAME:Introdução à programação/História da Programação}} |{{NEXTPAGENAME:Introdução à programação/História da Programação}} |- |Introdução à programação/Lógica |{{PREVPAGENAME:Introdução à programação/Lógica}} |{{NEXTPAGENAME:Introdução à programação/Lógica}} |- |Introdução à programação/Pseudo-código |{{PREVPAGENAME:Introdução à programação/Pseudo-código}} |{{NEXTPAGENAME:Introdução à programação/Pseudo-código}} |}