/** * @brief Adds Wall Notifications script to Monobook pages * * @return boolean * * @author Liz Lee */ public static function onSkinAfterBottomScripts(Skin $skin, &$text) { global $wgUser, $wgJsMimeType, $wgResourceBasePath, $wgExtensionsPath; if ($wgUser instanceof User && $wgUser->isLoggedIn() && $skin->getSkinName() == 'monobook') { $text .= "<script type=\"{$wgJsMimeType}\" src=\"{$wgResourceBasePath}/resources/wikia/libraries/jquery/timeago/jquery.timeago.js\"></script>\n" . "<script type=\"{$wgJsMimeType}\" src=\"{$wgExtensionsPath}/wikia/WallNotifications/scripts/WallNotifications.js\"></script>\n"; } return true; }
/** * @brief Adds Wall Notifications script to Monobook pages * * @return boolean * * @author Liz Lee */ public function onSkinAfterBottomScripts(Skin $skin, &$text) { $app = F::App(); $user = $app->wg->User; if ($user instanceof User && $user->isLoggedIn() && $skin->getSkinName() == 'monobook') { $text .= "<script type=\"{$app->wg->JsMimeType}\" src=\"{$app->wg->ResourceBasePath}/resources/wikia/libraries/jquery/timeago/jquery.timeago.js\"></script>\n" . "<script type=\"{$app->wg->JsMimeType}\" src=\"{$app->wg->ExtensionsPath}/wikia/Wall/js/WallNotifications.js\"></script>\n"; } return true; }
/** * Adds VisualEditor JS to the output. * * This is attached to the MediaWiki 'BeforePageDisplay' hook. * * @param OutputPage $output * @param Skin $skin * @return boolean */ public static function onBeforePageDisplay(OutputPage &$output, Skin &$skin) { $output->addModules(array('ext.visualEditor.desktopArticleTarget.init', 'ext.visualEditor.targetLoader')); $output->addModuleStyles(array('ext.visualEditor.desktopArticleTarget.noscript')); // add scroll offset js variable to output $veConfig = ConfigFactory::getDefaultInstance()->makeConfig('visualeditor'); $skinsToolbarScrollOffset = $veConfig->get('VisualEditorSkinToolbarScrollOffset'); $toolbarScrollOffset = 0; $skinName = $skin->getSkinName(); if (isset($skinsToolbarScrollOffset[$skinName])) { $toolbarScrollOffset = $skinsToolbarScrollOffset[$skinName]; } $output->addJsConfigVars('wgVisualEditorToolbarScrollOffset', $toolbarScrollOffset); return true; }
/** * @param Skin $sk The given Skin * @param bool $includeStyle Unused * @return string The doctype, opening "<html>", and head element. */ public function headElement(Skin $sk, $includeStyle = true) { global $wgContLang; $userdir = $this->getLanguage()->getDir(); $sitedir = $wgContLang->getDir(); $ret = Html::htmlHeader($sk->getHtmlElementAttributes()); if ($this->getHTMLTitle() == '') { $this->setHTMLTitle($this->msg('pagetitle', $this->getPageTitle())->inContentLanguage()); } $openHead = Html::openElement('head'); if ($openHead) { # Don't bother with the newline if $head == '' $ret .= "{$openHead}\n"; } if (!Html::isXmlMimeType($this->getConfig()->get('MimeType'))) { // Add <meta charset="UTF-8"> // This should be before <title> since it defines the charset used by // text including the text inside <title>. // The spec recommends defining XHTML5's charset using the XML declaration // instead of meta. // Our XML declaration is output by Html::htmlHeader. // http://www.whatwg.org/html/semantics.html#attr-meta-http-equiv-content-type // http://www.whatwg.org/html/semantics.html#charset $ret .= Html::element('meta', array('charset' => 'UTF-8')) . "\n"; } $ret .= Html::element('title', null, $this->getHTMLTitle()) . "\n"; foreach ($this->getHeadLinksArray() as $item) { $ret .= $item . "\n"; } // No newline after buildCssLinks since makeResourceLoaderLink did that already $ret .= $this->buildCssLinks(); $ret .= $this->getHeadScripts() . "\n"; foreach ($this->mHeadItems as $item) { $ret .= $item . "\n"; } $closeHead = Html::closeElement('head'); if ($closeHead) { $ret .= "{$closeHead}\n"; } $bodyClasses = array(); $bodyClasses[] = 'mediawiki'; # Classes for LTR/RTL directionality support $bodyClasses[] = $userdir; $bodyClasses[] = "sitedir-{$sitedir}"; if ($this->getLanguage()->capitalizeAllNouns()) { # A <body> class is probably not the best way to do this . . . $bodyClasses[] = 'capitalize-all-nouns'; } $bodyClasses[] = $sk->getPageClasses($this->getTitle()); $bodyClasses[] = 'skin-' . Sanitizer::escapeClass($sk->getSkinName()); $bodyClasses[] = 'action-' . Sanitizer::escapeClass(Action::getActionName($this->getContext())); $bodyAttrs = array(); // While the implode() is not strictly needed, it's used for backwards compatibility // (this used to be built as a string and hooks likely still expect that). $bodyAttrs['class'] = implode(' ', $bodyClasses); // Allow skins and extensions to add body attributes they need $sk->addToBodyAttributes($this, $bodyAttrs); Hooks::run('OutputPageBodyAttributes', array($this, $sk, &$bodyAttrs)); $ret .= Html::openElement('body', $bodyAttrs) . "\n"; return $ret; }
/** * TODO: Document * @param $skin Skin * @param $modules Array/string with the module name * @param $only String ResourceLoaderModule TYPE_ class constant * @param $useESI boolean * @return string html <script> and <style> tags */ protected function makeResourceLoaderLink(Skin $skin, $modules, $only, $useESI = false) { global $wgLoadScript, $wgResourceLoaderUseESI; // Lazy-load ResourceLoader // TODO: Should this be a static function of ResourceLoader instead? $baseQuery = array('lang' => $this->getContext()->getLang()->getCode(), 'debug' => ResourceLoader::inDebugMode() ? 'true' : 'false', 'skin' => $skin->getSkinName(), 'only' => $only); // Propagate printable and handheld parameters if present if ($this->isPrintable()) { $baseQuery['printable'] = 1; } if ($this->getRequest()->getBool('handheld')) { $baseQuery['handheld'] = 1; } if (!count($modules)) { return ''; } if (count($modules) > 1) { // Remove duplicate module requests $modules = array_unique((array) $modules); // Sort module names so requests are more uniform sort($modules); if (ResourceLoader::inDebugMode()) { // Recursively call us for every item $links = ''; foreach ($modules as $name) { $links .= $this->makeResourceLoaderLink($skin, $name, $only, $useESI); } return $links; } } // Create keyed-by-group list of module objects from modules list $groups = array(); $resourceLoader = $this->getResourceLoader(); foreach ((array) $modules as $name) { $module = $resourceLoader->getModule($name); # Check that we're allowed to include this module on this page if (!$module || $module->getOrigin() > $this->getAllowedModules(ResourceLoaderModule::TYPE_SCRIPTS) && $only == ResourceLoaderModule::TYPE_SCRIPTS || $module->getOrigin() > $this->getAllowedModules(ResourceLoaderModule::TYPE_STYLES) && $only == ResourceLoaderModule::TYPE_STYLES) { continue; } $group = $module->getGroup(); if (!isset($groups[$group])) { $groups[$group] = array(); } $groups[$group][$name] = $module; } $links = ''; foreach ($groups as $group => $modules) { $query = $baseQuery; // Special handling for user-specific groups if (($group === 'user' || $group === 'private') && $this->getUser()->isLoggedIn()) { $query['user'] = $this->getUser()->getName(); } // Create a fake request based on the one we are about to make so modules return // correct timestamp and emptiness data $context = new ResourceLoaderContext($resourceLoader, new FauxRequest($query)); // Drop modules that know they're empty foreach ($modules as $key => $module) { if ($module->isKnownEmpty($context)) { unset($modules[$key]); } } // If there are no modules left, skip this group if ($modules === array()) { continue; } $query['modules'] = ResourceLoader::makePackedModulesString(array_keys($modules)); // Inline private modules. These can't be loaded through load.php for security // reasons, see bug 34907. Note that these modules should be loaded from // getHeadScripts() before the first loader call. Otherwise other modules can't // properly use them as dependencies (bug 30914) if ($group === 'private') { if ($only == ResourceLoaderModule::TYPE_STYLES) { $links .= Html::inlineStyle($resourceLoader->makeModuleResponse($context, $modules)); } else { $links .= Html::inlineScript(ResourceLoader::makeLoaderConditionalScript($resourceLoader->makeModuleResponse($context, $modules))); } continue; } // Special handling for the user group; because users might change their stuff // on-wiki like user pages, or user preferences; we need to find the highest // timestamp of these user-changable modules so we can ensure cache misses on change // This should NOT be done for the site group (bug 27564) because anons get that too // and we shouldn't be putting timestamps in Squid-cached HTML if ($group === 'user') { // Get the maximum timestamp $timestamp = 1; foreach ($modules as $module) { $timestamp = max($timestamp, $module->getModifiedTime($context)); } // Add a version parameter so cache will break when things change $query['version'] = wfTimestamp(TS_ISO_8601_BASIC, $timestamp); } // Make queries uniform in order ksort($query); $url = wfAppendQuery($wgLoadScript, $query); // Prevent the IE6 extension check from being triggered (bug 28840) // by appending a character that's invalid in Windows extensions ('*') $url .= '&*'; if ($useESI && $wgResourceLoaderUseESI) { $esi = Xml::element('esi:include', array('src' => $url)); if ($only == ResourceLoaderModule::TYPE_STYLES) { $link = Html::inlineStyle($esi); } else { $link = Html::inlineScript($esi); } } else { // Automatically select style/script elements if ($only === ResourceLoaderModule::TYPE_STYLES) { $link = Html::linkedStyle($url); } else { $link = Html::linkedScript($url); } } if ($group == 'noscript') { $links .= Html::rawElement('noscript', array(), $link) . "\n"; } else { $links .= $link . "\n"; } } return $links; }
/** * Gets the global variables and mScripts; also adds userjs to the end if * enabled * * @param $sk Skin object to use * @return String: HTML fragment */ function getHeadScripts(Skin $sk) { global $wgUser, $wgRequest, $wgJsMimeType, $wgUseSiteJs; global $wgStylePath, $wgStyleVersion; $scripts = Skin::makeGlobalVariablesScript($sk->getSkinName()); $scripts .= Html::linkedScript("{$wgStylePath}/common/wikibits.js?{$wgStyleVersion}"); //add site JS if enabled: if ($wgUseSiteJs) { $jsCache = $wgUser->isLoggedIn() ? '&smaxage=0' : ''; $this->addScriptFile(Skin::makeUrl('-', "action=raw{$jsCache}&gen=js&useskin=" . urlencode($sk->getSkinName()))); } //add user js if enabled: if ($this->isUserJsAllowed() && $wgUser->isLoggedIn()) { $action = $wgRequest->getVal('action', 'view'); if ($this->mTitle && $this->mTitle->isJsSubpage() and $sk->userCanPreview($action)) { # XXX: additional security check/prompt? $this->addInlineScript($wgRequest->getText('wpTextbox1')); } else { $userpage = $wgUser->getUserPage(); $scriptpage = Title::makeTitleSafe(NS_USER, $userpage->getDBkey() . '/' . $sk->getSkinName() . '.js'); if ($scriptpage && $scriptpage->exists()) { $userjs = Skin::makeUrl($scriptpage->getPrefixedText(), 'action=raw&ctype=' . $wgJsMimeType); $this->addScriptFile($userjs); } } } $scripts .= "\n" . $this->mScripts; return $scripts; }
/** * @param Skin $sk The given Skin * @param bool $includeStyle Unused * @return string The doctype, opening "<html>", and head element. */ public function headElement(Skin $sk, $includeStyle = true) { global $wgContLang; $userdir = $this->getLanguage()->getDir(); $sitedir = $wgContLang->getDir(); $pieces = []; $pieces[] = Html::htmlHeader(Sanitizer::mergeAttributes($this->getRlClient()->getDocumentAttributes(), $sk->getHtmlElementAttributes())); $pieces[] = Html::openElement('head'); if ($this->getHTMLTitle() == '') { $this->setHTMLTitle($this->msg('pagetitle', $this->getPageTitle())->inContentLanguage()); } if (!Html::isXmlMimeType($this->getConfig()->get('MimeType'))) { // Add <meta charset="UTF-8"> // This should be before <title> since it defines the charset used by // text including the text inside <title>. // The spec recommends defining XHTML5's charset using the XML declaration // instead of meta. // Our XML declaration is output by Html::htmlHeader. // http://www.whatwg.org/html/semantics.html#attr-meta-http-equiv-content-type // http://www.whatwg.org/html/semantics.html#charset $pieces[] = Html::element('meta', ['charset' => 'UTF-8']); } $pieces[] = Html::element('title', null, $this->getHTMLTitle()); $pieces[] = $this->getRlClient()->getHeadHtml(); $pieces[] = $this->buildExemptModules(); $pieces = array_merge($pieces, array_values($this->getHeadLinksArray())); $pieces = array_merge($pieces, array_values($this->mHeadItems)); $pieces[] = Html::closeElement('head'); $bodyClasses = []; $bodyClasses[] = 'mediawiki'; # Classes for LTR/RTL directionality support $bodyClasses[] = $userdir; $bodyClasses[] = "sitedir-{$sitedir}"; if ($this->getLanguage()->capitalizeAllNouns()) { # A <body> class is probably not the best way to do this . . . $bodyClasses[] = 'capitalize-all-nouns'; } // Parser feature migration class // The idea is that this will eventually be removed, after the wikitext // which requires it is cleaned up. $bodyClasses[] = 'mw-hide-empty-elt'; $bodyClasses[] = $sk->getPageClasses($this->getTitle()); $bodyClasses[] = 'skin-' . Sanitizer::escapeClass($sk->getSkinName()); $bodyClasses[] = 'action-' . Sanitizer::escapeClass(Action::getActionName($this->getContext())); $bodyAttrs = []; // While the implode() is not strictly needed, it's used for backwards compatibility // (this used to be built as a string and hooks likely still expect that). $bodyAttrs['class'] = implode(' ', $bodyClasses); // Allow skins and extensions to add body attributes they need $sk->addToBodyAttributes($this, $bodyAttrs); Hooks::run('OutputPageBodyAttributes', [$this, $sk, &$bodyAttrs]); $pieces[] = Html::openElement('body', $bodyAttrs); return self::combineWrappedStrings($pieces); }
/** * @param $sk Skin The given Skin * @param $includeStyle Boolean: unused * @return String: The doctype, opening <html>, and head element. */ public function headElement(Skin $sk, $includeStyle = true) { global $wgContLang; # start wikia change global $wgDevelEnvironment; if ($wgDevelEnvironment) { $this->addMeta('robots', 'noindex, nofollow'); } # end wikia change $userdir = $this->getLanguage()->getDir(); $sitedir = $wgContLang->getDir(); if ($sk->commonPrintStylesheet()) { $this->addModuleStyles('mediawiki.legacy.wikiprintable'); } $ret = Html::htmlHeader(array('lang' => $this->getLanguage()->getHtmlCode(), 'dir' => $userdir, 'class' => 'client-nojs')); if ($this->getHTMLTitle() == '') { # start wikia change wfProfileIn("parsePageTitle"); $this->setHTMLTitle($this->getWikiaPageTitle($this->getPageTitle())); wfProfileOut("parsePageTitle"); # end wikia change # $this->setHTMLTitle( $this->msg( 'pagetitle', $this->getPageTitle() ) ); } $openHead = Html::openElement('head'); if ($openHead) { # Don't bother with the newline if $head == '' $ret .= "{$openHead}\n"; } $ret .= Html::element('title', null, $this->getHTMLTitle()) . "\n"; $ret .= implode("\n", array($this->getHeadLinks(null, true), $this->buildCssLinks(), $this->getHeadScripts(), $this->getHeadItems())); $closeHead = Html::closeElement('head'); if ($closeHead) { $ret .= "{$closeHead}\n"; } $bodyAttrs = array(); # Classes for LTR/RTL directionality support $bodyAttrs['class'] = "mediawiki {$userdir} sitedir-{$sitedir}"; if ($this->getLanguage()->capitalizeAllNouns()) { # A <body> class is probably not the best way to do this . . . $bodyAttrs['class'] .= ' capitalize-all-nouns'; } $bodyAttrs['class'] .= ' ' . $sk->getPageClasses($this->getTitle()); $bodyAttrs['class'] .= ' skin-' . Sanitizer::escapeClass($sk->getSkinName()); $bodyAttrs['class'] .= ' action-' . Sanitizer::escapeClass(Action::getActionName($this->getContext())); $sk->addToBodyAttributes($this, $bodyAttrs); // Allow skins to add body attributes they need wfRunHooks('OutputPageBodyAttributes', array($this, $sk, &$bodyAttrs)); $ret .= Html::openElement('body', $bodyAttrs) . "\n"; return $ret; }
public static function onSkinAfterBottomScripts(Skin $skin, &$text) { // TODO: Check whether this works also on Oasis! if ($skin->getSkinName() === 'venus') { $text .= AdEngine2Controller::getLiftiumOptionsScript(); $text .= Html::inlineScript('Liftium.init();') . "\n"; } return true; }
/** * Checks if given asset's group should be loaded for provided skin * @param string $group - Asset Manager group name * @param Skin $skin - skin instance * @return bool whether group should be loaded for given skin */ public function checkIfGroupForSkin($group, Skin $skin) { $this->loadConfig(); $skinName = $skin->getSkinName(); $registeredSkin = $this->mAssetsConfig->getGroupSkin($group); $check = is_array($registeredSkin) ? in_array($skinName, $registeredSkin) : $skinName === $registeredSkin; //if not strict packages with no skin registered are positive if ($skin instanceof WikiaSkin && $skin->isStrict() === false) { $check = $check || empty($registeredSkin); } return $check; }