MakeGlobalVariablesScript hook. * * Sets the value of the wgRelatedArticles global variable * to the list of related articles in the cached parser output. * * @param array $vars * @param OutputPage $out * @return boolean Always true */ public static function onMakeGlobalVariablesScript( &$vars, OutputPage $out ) { $config = ConfigFactory::getDefaultInstance()->makeConfig( 'RelatedArticles' ); $vars['wgRelatedArticles'] = $out->getProperty( 'RelatedArticles' ); $vars['wgRelatedArticlesUseCirrusSearch'] = $config->get( 'RelatedArticlesUseCirrusSearch' ); $vars['wgRelatedArticlesOnlyUseCirrusSearch'] = $config->get( 'RelatedArticlesOnlyUseCirrusSearch' ); return true; } /** * Uses the Disambiguator extension to test whether the page is a disambiguation page. * * If the Disambiguator extension isn't installed, then the test always fails, i.e. the page is * never a disambiguation page. * * @return boolean */ private static function isDisambiguationPage( Title $title ) { return class_exists( 'DisambiguatorHooks' ) && DisambiguatorHooks::isDisambiguationPage( $title ); } /** * Check whether the output page is a diff page * * @param OutputPage $out * @return bool */ private static function isDiffPage( OutputPage $out ) { $request = $out->getRequest(); $type = $request->getText( 'type' ); $diff = $request->getText( 'diff' ); $oldId = $request->getText( 'oldid' ); $isSpecialMobileDiff = $out->getTitle()->isSpecial( 'MobileDiff' ); return $type === 'revision' || $diff || $oldId || $isSpecialMobileDiff; } /** * Is ReadMore allowed on skin? * * The feature is allowed on all skins as long as they are not blacklisted * in the configuration variable `RelatedArticlesFooterBlacklistedSkins`. * On desktop, the beta feature needs to be enabled by the user as well. * * @param User $user * @param Skin $skin * @return bool */ private static function isReadMoreAllowedOnSkin( User $user, Skin $skin ) { $config = ConfigFactory::getDefaultInstance()->makeConfig( 'RelatedArticles' ); $blacklistedSkins = $config->get( 'RelatedArticlesFooterBlacklistedSkins' ); $skinName = $skin->getSkinName(); $isBlacklistedSkin = in_array( $skinName, $blacklistedSkins ); if ( !$isBlacklistedSkin ) { // Minerva has its own beta mode and doesn't use the BetaFeatures extension. if ( $skinName === 'minerva' ) { return true; } return class_exists( 'BetaFeatures' ) && BetaFeatures::isFeatureEnabled( $user, 'read-more' ); } return false; } /** * Handler for the BeforePageDisplay hook. * * Adds the ext.relatedArticles.readMore.bootstrap module * to the output when: * *
    *
  1. $wgRelatedArticlesShowInFooter is truthy
  2. *
  3. On mobile, the output is being rendered with * SkinMinervaBeta
  4. *
  5. The page is in mainspace
  6. *
  7. The action is 'view'
  8. *
  9. The page is not the Main Page
  10. *
  11. The page is not a disambiguation page
  12. *
  13. The page is not a diff page
  14. *
  15. The feature is allowed on the skin (see isReadMoreAllowedOnSkin() above)
  16. *
* * @param OutputPage $out * @param Skin $skin * @return boolean Always true */ public static function onBeforePageDisplay( OutputPage $out, Skin $skin ) { $config = ConfigFactory::getDefaultInstance()->makeConfig( 'RelatedArticles' ); $showReadMore = $config->get( 'RelatedArticlesShowInFooter' ); $title = $out->getContext()->getTitle(); $action = $out->getRequest()->getText( 'action', 'view' ); if ( $showReadMore && $title->inNamespace( NS_MAIN ) && // T120735 $action === 'view' && !$title->isMainPage() && !self::isDisambiguationPage( $title ) && !self::isDiffPage( $out ) && self::isReadMoreAllowedOnSkin( $out->getUser(), $skin ) ) { $out->addModules( [ 'ext.relatedArticles.readMore.bootstrap' ] ); } return true; } /** * EventLoggingRegisterSchemas hook handler. * * Registers our EventLogging schemas so that they can be converted to * ResourceLoaderSchemaModules by the EventLogging extension. * * If the module has already been registered in * onResourceLoaderRegisterModules, then it is overwritten. * * @param array $schemas The schemas currently registered with the EventLogging * extension * @return bool Always true */ public static function onEventLoggingRegisterSchemas( &$schemas ) { // @see https://meta.wikimedia.org/wiki/Schema:RelatedArticles $schemas['RelatedArticles'] = 14496900; return true; } /** * ResourceLoaderGetConfigVars hook handler for setting a config variable * @see https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderGetConfigVars * * @param array $vars * @return boolean */ public static function onResourceLoaderGetConfigVars( &$vars ) { $config = ConfigFactory::getDefaultInstance()->makeConfig( 'RelatedArticles' ); $vars['wgRelatedArticlesLoggingSamplingRate'] = $config->get( 'RelatedArticlesLoggingSamplingRate' ); return true; } /** * Register the "ext.relatedArticles.readMore" module. * Optionally update the dependencies and scripts if EventLogging is installed. * * @see https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderRegisterModules * * @param ResourceLoader &$resourceLoader The ResourceLoader object * @return boolean */ public static function onResourceLoaderRegisterModules( ResourceLoader &$resourceLoader ) { $dependencies = [ "mediawiki.user", "mediawiki.util" ]; $scripts = [ "resources/ext.relatedArticles.readMore/index.js" ]; if ( class_exists( 'EventLogging' ) ) { $dependencies[] = "mediawiki.viewport"; $dependencies[] = "ext.eventLogging.Schema"; $scripts[] = "resources/ext.relatedArticles.readMore/eventLogging.js"; } $resourceLoader->register( "ext.relatedArticles.readMore", [ "dependencies" => $dependencies, "scripts" => $scripts, "styles" => [ "resources/ext.relatedArticles.readMore/readMore.less" ], "skinStyles" => [ "default" => "resources/ext.relatedArticles.readMore/readMore.default.less", "monobook" => [ "resources/ext.relatedArticles.readMore/readMore.default.less", "resources/ext.relatedArticles.readMore/readMore.monobook.less" ], "minerva" => "" ], "messages" => [ "relatedarticles-read-more-heading" ], "targets" => [ "desktop", "mobile" ], "localBasePath" => __DIR__ . "/..", "remoteExtPath" => "RelatedArticles" ] ); return true; } /** * GetBetaFeaturePreferences hook handler * The beta feature is for showing ReadMore, not for showing related * articles in the sidebar. * @see https://www.mediawiki.org/wiki/Manual:Hooks/GetBetaFeaturePreferences * * @param User $user * @param array $preferences * * @return bool */ public static function onGetBetaFeaturePreferences( User $user, array &$preferences ) { $config = ConfigFactory::getDefaultInstance()->makeConfig( 'RelatedArticles' ); $showReadMore = $config->get( 'RelatedArticlesShowInFooter' ); if ( $showReadMore ) { $wgExtensionAssetsPath = $config->get( 'ExtensionAssetsPath' ); $preferences['read-more'] = [ 'label-message' => 'relatedarticles-read-more-beta-feature-title', 'desc-message' => 'relatedarticles-read-more-beta-feature-description', 'screenshot' => [ 'ltr' => "$wgExtensionAssetsPath/RelatedArticles/images/BetaFeatures/wb-readmore-beta-ltr.svg", 'rtl' => "$wgExtensionAssetsPath/RelatedArticles/images/BetaFeatures/wb-readmore-beta-rtl.svg", ], 'info-link' => 'https://www.mediawiki.org/wiki/Reading/Web/Projects/Read_more', 'discussion-link' => 'https://www.mediawiki.org/wiki/Talk:Reading/Web/Projects/Read_more', ]; } return true; } }