User:Gizmhail/RawContent
[edit] Purpose
This extension adds the rawcontent parser function. It returns a page content unmodified (unlike msgnw wich transforms "---" symbols or bulleted lists). It can be seen as an improved (or fixed) msgnw.
It can be used, for instance, to include the true content of a page in a textarea form, using an extension like SimpleForm (trying to do this with msgnw parser function works, until the included page contains lists, includeonly sections or "----" symbols ).
It also adds the normalizedfullpagename parser function (see below).
[edit] Usage
{{#rawcontent:<Page title>}}
This will return <Page title> page content.
{{#normalizedfullpagename:<Full page title>}}
This will return namespace:pagetitle for <Full page title>, with namespace translated to english (for instance, "Modèle" namespace from a french wiki will be translated to "Template). It is useful, for instance, if you have to synchronize technical templates (like Template:Ambox of wikipedia) having the same name between several wikis in different languages.
[edit] Code
<?
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* @author Sebastien Poivre <gizmhail@gmail.com>
* @copyright Copyright (C) 2008 Sebastien Poivre
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
$wgExtensionCredits['parserhook'][] = array(
'name' => 'RawContent',
'author' => 'Orange Labs (Sebastien Poivre)',
'url' => 'http://www.mediawiki.org/wiki/User:Gizmhail/RawContent',
'description' => 'Add (mainly) the rawcontent parser function. It returns a page content unmodified (unlike msgnw wich transforms among others "---" symbols, includeonly sections or bulleted lists).',
'version' => 0.3
);
# Define a setup function
$wgExtensionFunctions[] = 'wfRawContentParserFunction_Setup';
# Add a hook to initialise the magic word
$wgHooks['LanguageGetMagic'][] = 'wfRawContentParserFunction_Magic';
$wgHooks['ParserAfterTidy'][] = 'wfRawContentParserAfterTidy';
function wfRawContentParserFunction_Setup() {
global $wgParser;
# Set a function hook associating the "rawcontent" magic word with our function
$wgParser->setFunctionHook( 'rawcontent', 'wfRawContentParserFunction_Render' );
$wgParser->setFunctionHook( 'normalizedfullpagename', 'wfRawContentParserFunctionNormalizedPageName_Render' );
}
function wfRawContentParserFunction_Magic( &$magicWords, $langCode ) {
# Add the magic word
# The first array element is case sensitive, in this case it is not case sensitive
# All remaining elements are synonyms for our parser function
$magicWords['rawcontent'] = array( 0, 'rawcontent' );
$magicWords['normalizedfullpagename'] = array( 0, 'normalizedfullpagename' );
# unless we return true, other parser functions extensions won't get loaded.
return true;
}
function wfRawContentParserFunction_Render( &$parser, $param1 = '', $param2 = '' ) {
# The parser function itself
# The input parameters are wikitext with templates expanded
# The output should be wikitext too
global $rawContentMarkerList;
$title = Title::newFromText( $param1 );
$articleContent = "";
if($title){
list($articleContent,$final_title) = $parser->fetchTemplateAndtitle( $title );
if(!$final_title||$final_title->getText()!=$title->getText()||$title->mNamespace!=$final_title->mNamespace){
$articleContent = '';
#Redirection
#TODO : check that it is the proper way to do this
$rev = Revision::newFromTitle( $title );
if($rev){
$articleContent = $rev->getText();
}
}
}
$makercount = count($rawContentMarkerList);
$marker = "xx-start-raw-content---".$makercount."-raw-content-end-xx";
$rawContentMarkerList[$makercount] = $articleContent;
return $marker;
}
function wfRawContentParserFunctionNormalizedPageName_Render(&$parser,$param1 = ''){
$title = Title::newFromText( $param1 );
$namespace = '';
$pagename = '';
if($title){
$namespace = Language::factory( 'en' )->getNsText($title->mNamespace);
$pagename = $title->getText();
}
if($namespace != ''){
$pagename = "$namespace:$pagename";
}
return $pagename;
}
function wfRawContentParserAfterTidy(&$parser, &$text){
global $rawContentMarkerList;
for ($i=0;$i<count($rawContentMarkerList);$i++)
$text = preg_replace(
'/xx-start-raw-content---'.$i.'-raw-content-end-xx/',
$rawContentMarkerList[$i],
$text);
return true;
}