. * * @file * @ingroup Skins */ declare( strict_types=1 ); namespace Citizen\Hooks; use MediaWiki\Hook\BeforePageDisplayHook; use MediaWiki\Skins\Hook\SkinPageReadyConfigHook; use OutputPage; use ResourceLoaderContext; use Skin; /** * Hooks to run relating the skin */ class SkinHooks implements SkinPageReadyConfigHook, BeforePageDisplayHook { /** * SkinPageReadyConfig hook handler * * Replace searchModule provided by skin. * * @since 1.35 * @param ResourceLoaderContext $context * @param mixed[] &$config Associative array of configurable options * @return void This hook must not abort, it must return no value */ public function onSkinPageReadyConfig( ResourceLoaderContext $context, array &$config ): void { // It's better to exit before any additional check if ( $context->getSkin() !== 'citizen' ) { return; } // Tell the `mediawiki.page.ready` module not to wire up search. $config['search'] = false; } /** * Adds the inline theme switcher script to the page * * @param OutputPage $out * @param Skin $skin */ public function onBeforePageDisplay( $out, $skin ): void { $nonce = $out->getCSP()->getNonce(); // Script content at 'skins.citizen.scripts.theme/inline.js // @phpcs:ignore Generic.Files.LineLength.TooLong $script = sprintf( '%s', $nonce !== false ? sprintf( ' nonce="%s"', $nonce ) : '', 'window.switchTheme=()=>{var e=t=>["auto","dark","light"].map(e=>t+e);const t=document.getElementById("theme-toggle");try{var i=window.localStorage.getItem("skin-citizen-theme");null!==i&&(document.documentElement.classList.remove(...e("skin-citizen-")),document.documentElement.classList.add("skin-citizen-"+i),t.classList.remove(...e("theme-toggle")),t.classList.add("theme-toggle-"+i))}catch(e){}},window.switchTheme();' ); $out->addHeadItem( 'skin.citizen.inline', $script ); } }