mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/DiscussionTools
synced 2024-11-17 05:10:50 +00:00
7ef3bffb1e
When the user clicks a "Reply" link on a page that is affected by the 'fostered' lint error (indicating fostered content in the HTML representation), display an error and refuse to edit it, as Parsoid's transformations will damage the page content. The error message includes a link to documentation about lint errors, and a link to the editor that will highlight the error location. Depends-On: I723ec766d1244d117f8d624440026fe5af0d3403 Bug: T246481 Change-Id: Ic60cb58f98d10dc9b113469e5d3bbfb2d2b0564f
177 lines
5.6 KiB
PHP
177 lines
5.6 KiB
PHP
<?php
|
|
/**
|
|
* DiscussionTools extension hooks
|
|
*
|
|
* @file
|
|
* @ingroup Extensions
|
|
* @license MIT
|
|
*/
|
|
|
|
use MediaWiki\MediaWikiServices;
|
|
|
|
class DiscussionToolsHooks {
|
|
|
|
private static $tags = [
|
|
'discussiontools',
|
|
// Features:
|
|
'discussiontools-reply',
|
|
'discussiontools-edit',
|
|
'discussiontools-newtopic',
|
|
// Input methods:
|
|
'discussiontools-source',
|
|
'discussiontools-visual',
|
|
];
|
|
|
|
public static function onRegistration() {
|
|
$coreConfig = RequestContext::getMain()->getConfig();
|
|
// If $wgLocaltimezone isn't hard-coded, it is evaluated from the system
|
|
// timezone. On some systems this isn't guaranteed to be static, for example
|
|
// on Debian, GMT can get converted to UTC, instead of Europe/London.
|
|
//
|
|
// Timestamp parsing assumes that the timezone never changes.
|
|
//
|
|
// HACK: Do not run this test on CI as $wgLocaltimezone is not configured.
|
|
if ( !$coreConfig->get( 'Localtimezone' ) && !getenv( 'ZUUL_PROJECT' ) ) {
|
|
throw new \ConfigException( 'DiscussionTools requires $wgLocaltimezone to be set' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds DiscussionTools JS to the output.
|
|
*
|
|
* This is attached to the MediaWiki 'BeforePageDisplay' hook.
|
|
*
|
|
* @param OutputPage $output The page view.
|
|
* @param Skin $skin The skin that's going to build the UI.
|
|
*/
|
|
public static function onBeforePageDisplay( OutputPage $output, Skin $skin ) {
|
|
$dtConfig = MediaWikiServices::getInstance()->getConfigFactory()
|
|
->makeConfig( 'discussiontools' );
|
|
$title = $output->getTitle();
|
|
$actionName = Action::getActionName( $output->getContext() );
|
|
$req = $output->getRequest();
|
|
$user = $skin->getUser();
|
|
$enabled = $dtConfig->get( 'DiscussionToolsEnable' ) && (
|
|
!$dtConfig->get( 'DiscussionToolsBeta' ) ||
|
|
$user->getOption( 'discussiontools-betaenable' )
|
|
);
|
|
|
|
if (
|
|
// Don't show on edit pages, history, etc.
|
|
$actionName === 'view' &&
|
|
// Only wikitext pages (e.g. not Flow boards)
|
|
$title->getContentModel() === CONTENT_MODEL_WIKITEXT &&
|
|
(
|
|
// Query parameter to load on any wikitext page for testing
|
|
$req->getVal( 'dtenable' ) ||
|
|
// If configured, load on all talk pages
|
|
( $enabled && (
|
|
$title->isTalkPage() ||
|
|
// Treat pages with __NEWSECTIONLINK__ as talk pages (T245890)
|
|
$output->showNewSectionLink()
|
|
// TODO: Consider not loading if forceHideNewSectionLink is true.
|
|
) )
|
|
)
|
|
) {
|
|
$output->addModules( [
|
|
'ext.discussionTools.init'
|
|
] );
|
|
}
|
|
|
|
if ( $actionName === 'edit' && $req->getVal( 'dtlinterror' ) ) {
|
|
// TODO: Should we copy this module from the Linter extension?
|
|
$output->addJsConfigVars( [
|
|
'wgLinterErrorLocation' =>
|
|
array_map( 'intval', explode( '-', $req->getVal( 'dtlinterror' ), 2 ) ),
|
|
] );
|
|
$output->addModules( 'ext.linter.edit' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set static (not request-specific) JS configuration variables
|
|
*
|
|
* @see https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderGetConfigVars
|
|
* @param array &$vars Array of variables to be added into the output of the startup module
|
|
* @param string $skinName Current skin name to restrict config variables to a certain skin
|
|
*/
|
|
public static function onResourceLoaderGetConfigVars( &$vars, $skinName ) {
|
|
$dtConfig = MediaWikiServices::getInstance()->getConfigFactory()
|
|
->makeConfig( 'discussiontools' );
|
|
|
|
$vars['wgDTSchemaEditAttemptStepSamplingRate'] =
|
|
$dtConfig->get( 'DTSchemaEditAttemptStepSamplingRate' );
|
|
$vars['wgDTSchemaEditAttemptStepOversample'] =
|
|
$dtConfig->get( 'DTSchemaEditAttemptStepOversample' );
|
|
}
|
|
|
|
/**
|
|
* Handler for the GetBetaPreferences hook, to add and hide user beta preferences as configured
|
|
*
|
|
* @param User $user The user object
|
|
* @param array &$preferences Their preferences object
|
|
*/
|
|
public static function onGetBetaPreferences( User $user, array &$preferences ) {
|
|
$coreConfig = RequestContext::getMain()->getConfig();
|
|
$iconpath = $coreConfig->get( 'ExtensionAssetsPath' ) . '/DiscussionTools/images';
|
|
|
|
$dtConfig = MediaWikiServices::getInstance()->getConfigFactory()
|
|
->makeConfig( 'discussiontools' );
|
|
|
|
if (
|
|
$dtConfig->get( 'DiscussionToolsEnable' ) &&
|
|
$dtConfig->get( 'DiscussionToolsBeta' )
|
|
) {
|
|
$preferences['discussiontools-betaenable'] = [
|
|
'version' => '1.0',
|
|
'label-message' => 'discussiontools-preference-label',
|
|
'desc-message' => 'discussiontools-preference-description',
|
|
'screenshot' => [
|
|
'ltr' => "$iconpath/betafeatures-icon-DiscussionTools-ltr.svg",
|
|
'rtl' => "$iconpath/betafeatures-icon-DiscussionTools-rtl.svg",
|
|
],
|
|
'info-message' => 'discussiontools-preference-info-link',
|
|
'discussion-message' => 'discussiontools-preference-discussion-link',
|
|
'requirements' => [
|
|
'javascript' => true
|
|
]
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Implements the ListDefinedTags and ChangeTagsListActive hooks, to
|
|
* populate core Special:Tags with the change tags in use by DiscussionTools.
|
|
*
|
|
* @param array &$tags Available change tags.
|
|
*/
|
|
public static function onListDefinedTags( &$tags ) {
|
|
$tags = array_merge( $tags, static::$tags );
|
|
}
|
|
|
|
/**
|
|
* Implements the RecentChange_save hook, to add a whitelisted set of changetags
|
|
* to edits.
|
|
*
|
|
* @param RecentChange $recentChange
|
|
* @return bool
|
|
*/
|
|
public static function onRecentChangeSave( RecentChange $recentChange ) {
|
|
// only apply to api edits, since there's no case where discussiontools
|
|
// should be using the form-submit method.
|
|
if ( !defined( 'MW_API' ) ) {
|
|
return true;
|
|
}
|
|
$request = RequestContext::getMain()->getRequest();
|
|
$tags = explode( ',', $request->getVal( 'dttags' ) );
|
|
|
|
$tags = array_values( array_intersect( $tags, static::$tags ) );
|
|
|
|
if ( $tags ) {
|
|
$recentChange->addTags( $tags );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|