Extract all hook handler functions to small glue classes

As of now, this patch does not touch the existing code. However, the
goal is to remove a lot of the related code from the Cite class. This
will be done in later patches. This here is a separate patch to make
reviewing the later patches much easier.

The existing parser tests should be proof enough this chain of patches
is not changing any behavior.

Change-Id: I27ae972f81071bb4036bd452560768fae409417b
This commit is contained in:
Thiemo Kreuz 2019-11-04 16:33:07 +01:00
parent f590379a64
commit 1a371ec6a5
5 changed files with 102 additions and 9 deletions

View file

@ -120,7 +120,9 @@
"Cite": "includes/Cite.php",
"CiteHooks": "includes/CiteHooks.php",
"CiteDataModule": "includes/CiteDataModule.php",
"CiteCSSFileModule": "includes/CiteCSSFileModule.php"
"CiteCSSFileModule": "includes/CiteCSSFileModule.php",
"CiteParserHooks": "includes/CiteParserHooks.php",
"CiteParserTagHooks": "includes/CiteParserTagHooks.php"
},
"TrackingCategories": [
"cite-tracking-category-cite-error"

View file

@ -1144,8 +1144,8 @@ class Cite {
}
$parser->extCite = clone $this;
$parser->setHook( 'ref', [ $parser->extCite, 'ref' ] );
$parser->setHook( 'references', [ $parser->extCite, 'references' ] );
$parser->setHook( 'ref', 'CiteParserTagHooks::ref' );
$parser->setHook( 'references', 'CiteParserTagHooks::references' );
// Clear the state, making sure it will actually work.
$parser->extCite->mInCite = false;

View file

@ -25,15 +25,15 @@ class CiteHooks {
$parser->extCite = new Cite();
if ( !self::$hooksInstalled ) {
$wgHooks['ParserClearState'][] = [ $parser->extCite, 'clearState' ];
$wgHooks['ParserCloned'][] = [ $parser->extCite, 'cloneState' ];
$wgHooks['ParserAfterParse'][] = [ $parser->extCite, 'checkRefsNoReferences', true ];
$wgHooks['ParserBeforeTidy'][] = [ $parser->extCite, 'checkRefsNoReferences', false ];
$wgHooks['ParserClearState'][] = 'CiteParserHooks::onParserClearState';
$wgHooks['ParserCloned'][] = 'CiteParserHooks::onParserCloned';
$wgHooks['ParserAfterParse'][] = 'CiteParserHooks::onParserAfterParse';
$wgHooks['ParserBeforeTidy'][] = 'CiteParserHooks::onParserBeforeTidy';
self::$hooksInstalled = true;
}
$parser->setHook( 'ref', [ $parser->extCite, 'ref' ] );
$parser->setHook( 'references', [ $parser->extCite, 'references' ] );
$parser->setHook( 'ref', 'CiteParserTagHooks::ref' );
$parser->setHook( 'references', 'CiteParserTagHooks::references' );
}
/**

View file

@ -0,0 +1,52 @@
<?php
class CiteParserHooks {
/**
* @see https://www.mediawiki.org/wiki/Manual:Hooks/ParserClearState
*
* @param Parser $parser
*/
public static function onParserClearState( Parser $parser ) {
/** @var Cite $cite */
$cite = $parser->extCite;
$cite->clearState( $parser );
}
/**
* @see https://www.mediawiki.org/wiki/Manual:Hooks/ParserCloned
*
* @param Parser $parser
*/
public static function onParserCloned( Parser $parser ) {
/** @var Cite $cite */
$cite = $parser->extCite;
$cite->cloneState( $parser );
}
/**
* @see https://www.mediawiki.org/wiki/Manual:Hooks/ParserAfterParse
*
* @param Parser $parser
* @param string &$text
* @param StripState $stripState
*/
public static function onParserAfterParse( Parser $parser, &$text, $stripState ) {
/** @var Cite $cite */
$cite = $parser->extCite;
$cite->checkRefsNoReferences( true, $parser, $text );
}
/**
* @see https://www.mediawiki.org/wiki/Manual:Hooks/ParserBeforeTidy
*
* @param Parser $parser
* @param string &$text
*/
public static function onParserBeforeTidy( Parser $parser, &$text ) {
/** @var Cite $cite */
$cite = $parser->extCite;
$cite->checkRefsNoReferences( false, $parser, $text );
}
}

View file

@ -0,0 +1,39 @@
<?php
class CiteParserTagHooks {
/**
* Parser hook for the <ref> tag.
*
* @param string|null $content Raw wikitext content of the <ref> tag.
* @param string[] $attributes
* @param Parser $parser
* @param PPFrame $frame
*
* @return string
*/
public static function ref( $content, array $attributes, Parser $parser, PPFrame $frame ) {
/** @var Cite $cite */
$cite = $parser->extCite;
// @phan-suppress-next-line SecurityCheck-XSS False positive
return $cite->ref( $content, $attributes, $parser, $frame );
}
/**
* Parser hook for the <references> tag.
*
* @param string|null $content Raw wikitext content of the <references> tag.
* @param string[] $attributes
* @param Parser $parser
* @param PPFrame $frame
*
* @return string
*/
public static function references( $content, array $attributes, Parser $parser, PPFrame $frame ) {
/** @var Cite $cite */
$cite = $parser->extCite;
// @phan-suppress-next-line SecurityCheck-XSS False positive
return $cite->references( $content, $attributes, $parser, $frame );
}
}