<?php
/**
 * IDL Tag extension
 * The IDLTagExtension was written to manage the IDL links in the OpenOffice.org Developer's Guide. 
 * The extension converts Java paths to links back to the online IDL documentation.
 * @version 1.1.0
 * @link http://wiki.openoffice.org/wiki/Wiki_maintenance/IDLTagExtension
 */

if ( !defined( 'MEDIAWIKI' ) ) {
	die( 'This file is a MediaWiki extension, it is not a valid entry point' );
}

// Extension credits that will show up on Special:Version
$wgExtensionCredits['parserhook'][] = array(
	'name' => 'IDL Tags',
	'version' => '1.1.0',
	'author' => array( 'Clayton Cornell', 'Terry Ellison' ),
	'description' => 'Manage the IDL links in the OOo Dev Guide ',
	'url' => 'http://wiki.openoffice.org/wiki/Wiki_maintenance/IDLTagExtension',
);

global $wgExtIDLtags;
$wgExtIDLtags           = new RenderIDLtags;
$wgExtensionFunctions[] = array( &$wgExtIDLtags, 'oooIDLTags' );

class RenderIDLtags { 

	function oooIDLTags() {
		global $wgParser;
		$wgParser->setHook( 'idl', array( &$this, 'renderIDL' ) );
		$wgParser->setHook( 'idlm', array( &$this, 'renderIDLM' ) );
		$wgParser->setHook( 'idls', array( &$this, 'renderIDLS' ) );
		$wgParser->setHook( 'idlmodule', array( &$this, 'renderIDLMODULE' ) );
		$wgParser->setHook( 'idltopic', array( &$this, 'renderIDLTOPIC' ) );
	}

	function renderIDL( $input, $args, $parser ) {
		$parser->disableCache();
		$output = $parser->recursiveTagParse( $input );
		$output = '<a href="http://api.openoffice.org/docs/common/ref/' . 
			str_replace ('.','/',$output).'.html" class="external text">'.$output.'</a>';
		return $output;
	}
	 
	function renderIDLM( $input, $args, $parser ) {
		$parser->disableCache();
		$output = $parser->recursiveTagParse( $input );
		$page = preg_replace ('/\./','/',$output);
		$anchor = preg_replace ('/:/','.html#',$page);
		$function = preg_replace ('/^.*:/','',$page);
		$output = '<a href="http://api.openoffice.org/docs/common/ref/' . 
			$anchor.'" class="external text">'.$function.'</a>';
		return $output;
	}
	 
	function renderIDLS( $input, $args, $parser ) {
		$parser->disableCache();
		$output = $parser->recursiveTagParse( $input );
		$function = preg_replace ('/^.*\./','',$output);
		$output = '<a href="http://api.openoffice.org/docs/common/ref/' . 
			preg_replace ('/\./','/',$output).'.html" class="external text">'.$function.'</a>';
		return $output;
	}
	 
	function renderIDLMODULE( $input, $args, $parser ) {
		$parser->disableCache();
		$output = $parser->recursiveTagParse( $input );
		$function = preg_replace ('/^.*\./','',$output);
		$output = '<a href="http://api.openoffice.org/docs/common/ref/' . 
			preg_replace ('/\./','/',$output).'/module-ix.html" class="external text">'.$output.'</a>';
		return $output;
	}
	 
	function renderIDLTOPIC( $input, $args, $parser ) {
		$parser->disableCache();
		return '';
	}
}


