/**
  * @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;
 }
Ejemplo n.º 3
0
 /**
  * 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;
 }
Ejemplo n.º 4
0
 /**
  * @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;
 }
Ejemplo n.º 5
0
 /**
  * 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;
 }
Ejemplo n.º 6
0
 /**
  * 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;
 }
Ejemplo n.º 7
0
 /**
  * @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);
 }
Ejemplo n.º 8
0
 /**
  * @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;
 }
Ejemplo n.º 9
0
 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;
 }
Ejemplo n.º 10
0
 /**
  * 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;
 }