Utilizador:Raylton P. Sousa/AutoNav

Origem: Wikilivros, livros abertos por um mundo aberto.

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}}
|}