mediawiki-extensions-Templa.../TemplateData.hooks.php
Kunal Mehta 4d3d1b72a4 Only enable OOUI if it will be used
If the TemplateData blob failed validation, then OOUI would be enabled
in the ParserOutput even though it wouldn't be used.

Also fix casing of the Status::getHTML() function call.

Change-Id: I1c1cc8ffd46deecd12a07bb13730a073a3363019
2016-08-31 00:57:44 -07:00

146 lines
4.6 KiB
PHP

<?php
/**
* Hooks for TemplateData extension
*
* @file
* @ingroup Extensions
*/
class TemplateDataHooks {
/**
* Register parser hooks
*/
public static function onParserFirstCallInit( &$parser ) {
$parser->setHook( 'templatedata', [ 'TemplateDataHooks', 'render' ] );
return true;
}
/**
* Register qunit unit tests
*/
public static function onResourceLoaderTestModules(
array &$testModules,
ResourceLoader &$resourceLoader
) {
$testModules['qunit']['ext.templateData.test'] = [
'scripts' => [ 'tests/ext.templateData.tests.js' ],
'dependencies' => [ 'ext.templateDataGenerator.data' ],
'localBasePath' => __DIR__ ,
'remoteExtPath' => 'TemplateData',
];
return true;
}
/**
* Conditionally register the jquery.uls.data module, in case they've already been
* registered by the UniversalLanguageSelector extension or the VisualEditor extension.
*
* @param ResourceLoader $resourceLoader
* @return boolean true
*/
public static function onResourceLoaderRegisterModules( ResourceLoader &$resourceLoader ) {
$resourceModules = $resourceLoader->getConfig()->get( 'ResourceModules' );
$name = 'jquery.uls.data';
if ( !isset( $resourceModules[$name] ) && !$resourceLoader->isModuleRegistered( $name ) ) {
$resourceLoader->register( [
'jquery.uls.data' => [
'localBasePath' => __DIR__,
'remoteExtPath' => 'TemplateData',
'scripts' => [
'lib/jquery.uls/src/jquery.uls.data.js',
'lib/jquery.uls/src/jquery.uls.data.utils.js',
],
'targets' => [ 'desktop', 'mobile' ],
]
] );
}
}
/**
* @param Page &$page
* @param User &$user
* @param Content &$content
* @param string &$summary
* @param $minor
* @param bool|null $watchthis
* @param $sectionanchor
* @param &$flags
* @param Status &$status
*/
public static function onPageContentSave( &$page, &$user, &$content, &$summary, $minor,
$watchthis, $sectionanchor, &$flags, &$status
) {
// The PageContentSave hook provides raw $text, but not $parser because at this stage
// the page is not actually parsed yet. Which means we can't know whether self::render()
// got a valid tag or not. Looking at $text directly is not a solution either as
// it may not be in the current page (it can be transcluded).
// Since there is no later hook that allows aborting the save and showing an error,
// we will have to trigger the parser ourselves.
// Fortunately this causes no overhead since the below (copied from WikiPage::doEditContent,
// right after this hook is ran) has guards that lazy-init and return early if called again
// later by the real WikiPage.
// Specify format the same way the API and EditPage do to avoid extra parsing
$format = $content->getContentHandler()->getDefaultFormat();
$editInfo = $page->prepareContentForEdit( $content, null, $user, $format );
if ( isset( $editInfo->output->ext_templatedata_status ) ) {
$validation = $editInfo->output->ext_templatedata_status;
if ( !$validation->isOK() ) {
// Abort edit, show error message from TemplateDataBlob::getStatus
$status->merge( $validation );
return false;
}
}
return true;
}
/**
* Parser hook registering the GUI module only in edit pages.
*
* @param EditPage $editPage
* @param OutputPage $output
* @return bool
*/
public static function onEditPage( $editPage, $output ) {
global $wgTemplateDataUseGUI;
if ( $wgTemplateDataUseGUI ) {
if ( $output->getTitle()->getNamespace() === NS_TEMPLATE ) {
$output->addModules( 'ext.templateDataGenerator.editPage' );
}
}
return true;
}
/**
* Parser hook for <templatedata>.
* If there is any JSON provided, render the template documentation on the page.
*
* @param string $input: The content of the tag.
* @param array $args: The attributes of the tag.
* @param Parser $parser: Parser instance available to render
* wikitext into html, or parser methods.
* @param PPFrame $frame: Can be used to see what template parameters ("{{{1}}}", etc.)
* this hook was used with.
*
* @return string: HTML to insert in the page.
*/
public static function render( $input, $args, $parser, $frame ) {
$ti = TemplateDataBlob::newFromJSON( $input );
$status = $ti->getStatus();
if ( !$status->isOK() ) {
$parser->getOutput()->ext_templatedata_status = $status;
return '<div class="errorbox">' . $status->getHTML() . '</div>';
}
$parser->getOutput()->setProperty( 'templatedata', $ti->getJSONForDatabase() );
$parser->getOutput()->addModuleStyles( 'ext.templateData' );
$parser->enableOOUI();
return $ti->getHtml( $parser->getOptions()->getUserLangObj() );
}
}