You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

113 lines
3.3 KiB

<?php
/**
* Refbase hooks and parser
*/
class RefbaseHooks {
/**
* Register <refbase> hook
*/
public static function efRefbaseParserInit( $parser ) {
$parser->setHook( 'refbase',
'RefbaseHooks::efRefbaseRender' );
return true;
}
/**
* Define special formatting for this tag
*/
private static function makeOutputString ( $str ) {
return $str;
}
/**
* Add <pre></pre> tags around error message and return
*/
private static function makeErrorOutputString ( $errMsg ) {
$errMsg = "Refbase: <br/>" . $errMsg;
$preMsg = Html::openElement( 'pre' ) . $errMsg .
Html::closeElement( 'pre' );
return self::makeOutputString( $preMsg );
}
/**
* Main function: parse input and create HTML table with events
*/
public static function efRefbaseRender( $input, array $args,
Parser $parser,
PPFrame $frame ) {
// Global parameters
global $wgRefbaseDefaultTagType;
global $wgRefbaseDefaultOutputType;
global $wgRefbaseDefaultCitationType;
// Read arguments
if ( isset( $args['tagtype'] ) ) {
$tagType = $args['tagtype'];
} else {
$tagType = $wgRefbaseDefaultTagType;
}
if ( ! ( strtolower( $tagType ) === 'serial' ) &&
! ( strtolower( $tagType ) === 'citekey' ) ) {
$errStr = wfMessage( 'refbase-error-tagtype' )->text();
return self::makeErrorOutputString( $errStr );
}
if ( isset( $args['output'] ) ) {
$outputType = $args['output'];
} else {
$outputType = $wgRefbaseDefaultOutputType;
}
if ( ! ( strtolower( $outputType ) === 'cite_journal' ) &&
! ( strtolower( $outputType ) === 'link' ) &&
! ( strtolower( $outputType ) === 'cite' ) ) {
$errStr = wfMessage( 'refbase-error-outputtype' )->text();
return self::makeErrorOutputString( $errStr );
}
if ( isset( $args['citationtype'] ) ) {
$citationType = $args['citationtype'];
} else {
$citationType = $wgRefbaseDefaultCitationType;
}
if ( ! ( strtolower( $citationType ) === 'minimal' ) &&
! ( strtolower( substr( $citationType, 0, 3 ) ) === 'rb-' ) ) {
$errStr = wfMessage( 'refbase-error-citation-type' )->text();
return self::makeErrorOutputString( $errStr );
}
// Order tag types
switch ( strtolower( $tagType ) ) {
case 'serial':
$tagTypeList = array( 'serial', 'citekey' );
break;
case 'citekey':
$tagTypeList = array( 'citekey', 'serial' );
break;
}
// Instantiate renderer based on options
$refbaseRenderer = RefbaseRenderer::create( $outputType,
$citationType );
// Request list of fields to extract
$fieldList = $refbaseRenderer->getFieldList();
// Perform database query to get entry
$refbaseDbConnector = new RefbaseConnector();
$entry = "";
if ( !$refbaseDbConnector->getEntry( $input, $tagTypeList, $entry,
$fieldList ) ) {
return self::makeErrorOutputString( $entry );
}
// Generate output
$citekey = $input;
$renderOpts = array( 'citekey' => $citekey );
$outputStr = "";
if ( !$refbaseRenderer->render( $entry, $outputStr, $renderOpts ) ) {
return self::makeErrorOutputString( $outputStr );
}
$outputStr = $parser->recursiveTagParse( $outputStr );
return self::makeOutputString( $outputStr );
}
}