Extension:ExtensionRenderer

This extension allows articles to use a custom renderer based on their extension. (e.g. SomStuff.extension)

Usage
To register a custom renderer: register adds the hook to $wgHooks['ExtensionRenderer'. ] so any value that is valid for $wgHooks is valid for register. The extension must start with a period ('.').

Download instructions
Please cut and paste the code found below and place it in. Note: $IP stands for the root directory of your MediaWiki installation, the same directory that holds LocalSettings.php.

Installation
To install this extension, add the following to LocalSettings.php:

Configuration parameters
By default .xml and .xsl are registered with the default renderer. ($wgExtensionRenderer->defaultExtensionRenderer) The default extension renderer just escapes any special html characters and wraps the results in pre tags. This can be disabled by changing the parameter to $wgExtensionRenderer->install to false.

Code
*	register adds the hook to $wgHooks['ExtensionRenderer'. ] so * 	any value that is valid for $wgHooks is valid for register. * The extension must start with a period ('.'). * * 	Rendering occurs at the 'ParserBeforeTidy' hook. * * 	Currently the extension disables itself during editing because it messes * 	up the edit page. (comment out the $this->mDisableRendering flag in the * 	first if statement in hookParserBeforeString and use the default renderer * 	to see what I mean); * * 	A default renderer (defaultExtensionRenderer) is included that merely * 	escapes html special characters and surrounds the result in pre tags. * * 	Acknowledgements * 	Extension:AlternateSyntaxParser was used to determine how to set things * 	up for custom rendering. * * 	@author Michael Eagar */

if ( !defined( 'MEDIAWIKI' ) ) { die( 'This file is a MediaWiki extension, it is not a valid entry point' ); }
 * 1) 	This is a mediawiki extension so don't execute if mediawiki isn't available

$wgExtensionCredits['parserhook'][] = array(   'name'  =>'ExtensionRenderer',    'author'=>'Michael Eagar',    'url'   =>'',    'description'=>'Allows custom rendering of registered extensions',    'version'    =>'Sep 8 2008' );
 * 1) Credits

/** *	Encapsulation of the extension */ class ExtensionRenderer {

public $mExtHooks = array;

public $mDisableRendering = false; /**    *	Register a hook for the given extension. * 	$hook is added to $wgHooks['ExtensionRenderer'. $ext] *    * @param unknown_type $ext * @param unknown_type $hook */   public function register($ext, $hook) { global $wgHooks; $this->mExtHooks[] = $ext; $wgHooks['ExtensionRenderer'. $ext][] = $hook; }

/**    *  Hides the article from the parser if the title ends in an extension * previously registered with register. *     * 	This function hooks into $wgHooks['ParserBeforeStrip'] *    *  @param Parser $parser The current parser * @param String $text   The article source * @return Boolean       false if wiki source was hidden, true otherwise */   public function hideText(&$parser, &$text) { global $wgTitle; global $wgRequest;

#  Make sure we're processing the main article. if (!$parser->mRevisionId || $this->mDisableRendering) { return true; }                  #   Determine the extension $ext = strrchr($wgTitle->getFullText, "."); if ($ext === false) { return false; }       if (array_search($ext, $this->mExtHooks) !== false) { $parser->mHiddenText = $text; $parser->mExt = $ext; $text = ""; } else { unset($parser->mHiddenText); unset($parser->mExt); }

return false; }

/**    *  Renders the article using a custom hook. *    * 	This function hooks into $wgHooks['ParserBeforeStrip'] *     *  @param Parser $parser The current parser * @param String $text   The article source * @return Boolean       false if an attempt was made to render the *                       article, true otherwise */   function showText(&$parser, &$text) { global $wgHooks;

#  Make sure the current article is an extension article if (!isset($parser->mHiddenText) || !isset($parser->mExt)) return true;

$ext = $parser->mExt; $result = wfRunHooks('ExtensionRenderer' . $ext, array( &$parser, &$parser->mHiddenText, $ext));

if ($result !== false) { $text .= "" . "Could not process extension. \n"; } else { $text .= ' '. $parser->mHiddenText. ' ';       }        unset($parser->mHiddenText); unset($parser->Ext); return false; }

/**    *	Disables custom rendering of extensions. And allows the wiki parser to    * 	work. * 	Currently this method is attached to    * 	  to prevent this * extension from messing up the edit page. Note that because custom * 	rendering is disabled preview might not display properly. */   function disableRendering( &$editpage ) { $this->mDisableRendering = true; return true; }

/**    *	Disables custom rendering of extensions. And allows the wiki parser to    * 	work. * 	Currently this method is attached to    * 	  to re-enable * this extension after being disabled at     * */   function enableRendering( &$editpage, &$out ) { $this->mDisableRendering = false; return true; }

/**	 *	Setup the default renderer, which just escapes special html characters and *	wraps the results in pre tags. */	function defaultExtensionRenderer(&$parser, &$text, $ext) { $text = ' '. htmlspecialchars($text). ' ';	   return false; }

/**    *	Insert this class into MediaWiki * 	If $addDefaultHooks is set some common extensions are registered. * 	(currently .xml and .xsl) *    *	@param Boolean $addDefaultHooks */   function install($addDefaultHooks) { $wgHooks['ParserBeforeStrip'][] = array($this, 'hideText'); $wgHooks['ParserAfterTidy'][] = array($this, 'showText'); $wgHooks['EditPage::showEditForm:initial'][] = array($this, 'disableRendering'); $wgHooks['EditPage::showEditForm:fields'][] = array($this, 'enableRendering');

if ($addDefaultHooks) { $this->register('.xml', 'defaultExtensionRenderer'); $this->register('.xsl', 'defaultExtensionRenderer'); }   	} }

$wgExtensionRenderer = new ExtensionRenderer; $wgExtensionRenderer->install(true);
 * 1) 	Insert this extension into MediaWiki
 * 1) 	Change the argument to true to add custom renderers for some common
 * 2) 	extensions. (Currently the default renderer is registered for .xsl and
 * 3) 	.xml)

Acknowledgments
Extension:AlternateSyntaxParser was used to determine how to set things up for custom rendering.