isLegacy() ) { $modules['styles']['skin'][] = 'skins.vector.styles.legacy'; $modules[Constants::SKIN_NAME] = 'skins.vector.legacy.js'; } else { $modules['styles'] = array_merge( $modules['styles'], [ 'skins.vector.styles', 'mediawiki.ui.icon', 'skins.vector.icons' ] ); $modules[Constants::SKIN_NAME][] = 'skins.vector.js'; } return $modules; } /** * Set up the VectorTemplate. Overrides the default behaviour of SkinTemplate allowing * the safe calling of constructor with additional arguments. If dropping this method * please ensure that VectorTemplate constructor arguments match those in SkinTemplate. * * @internal * @param string $classname * @return VectorTemplate */ protected function setupTemplate( $classname ) { $tp = new TemplateParser( __DIR__ . '/templates' ); return new VectorTemplate( $this->getConfig(), $tp, $this->isLegacy() ); } /** * Whether or not the legacy version of the skin is being used. * * @return bool */ private function isLegacy() : bool { $isLatestSkinFeatureEnabled = MediaWikiServices::getInstance() ->getService( Constants::SERVICE_FEATURE_MANAGER ) ->isFeatureEnabled( Constants::FEATURE_LATEST_SKIN ); return !$isLatestSkinFeatureEnabled; } /** * @internal only for use inside VectorTemplate * @return array of data for a Mustache template */ public function getTemplateData() { $out = $this->getOutput(); $title = $out->getTitle(); $indicators = []; foreach ( $out->getIndicators() as $id => $content ) { $indicators[] = [ 'id' => Sanitizer::escapeIdForAttribute( "mw-indicator-$id" ), 'class' => 'mw-indicator', 'html' => $content, ]; } return [ // Data objects: 'data-indicators' => $indicators, // HTML strings: 'html-printtail' => WrappedString::join( "\n", [ MWDebug::getDebugHTML( $this->getContext() ), $this->bottomScripts(), wfReportTime( $out->getCSP()->getNonce() ) ] ) . '', 'html-sitenotice' => $this->getSiteNotice(), 'html-userlangattributes' => $this->prepareUserLanguageAttributes(), 'html-subtitle' => $this->prepareSubtitle(), // Always returns string, cast to null if empty. 'html-undelete' => $this->prepareUndeleteLink() ?: null, // Result of OutputPage::addHTML calls 'html-bodycontent' => $this->wrapHTML( $title, $out->mBodytext ), 'html-dataAfterContent' => $this->afterContentHook(), // From MWDebug::getHTMLDebugLog (when $wgShowDebug is enabled) 'html-debuglog' => $this->generateDebugHTML(), ]; } /** * @internal only for use inside VectorTemplate * @return array */ public function getMenuProps() { return $this->buildContentNavigationUrls(); } }