public function onOutputPageBeforeHTML(OutputPage &$out, &$text)
 {
     wfProfileIn(__METHOD__);
     if ($out->isArticle() && F::app()->wg->request->getVal('diff') === null && F::app()->wg->title->getNamespace() == NS_MAIN) {
         $text .= F::app()->sendRequest('RelatedVideos', 'getCarusel')->toString();
     }
     wfProfileOut(__METHOD__);
     return true;
 }
Example #2
0
/**
 * @param OutputPage $out
 * @param $text
 * @return bool
 */
function SharedHelpHook(&$out, &$text)
{
    global $wgTitle, $wgMemc, $wgSharedDB, $wgCityId, $wgHelpWikiId, $wgContLang, $wgLanguageCode, $wgArticlePath;
    /* Insurance that hook will be called only once #BugId:  */
    static $wasCalled = false;
    if ($wasCalled == true) {
        return true;
    }
    $wasCalled = true;
    if (empty($wgHelpWikiId) || $wgCityId == $wgHelpWikiId) {
        # Do not proceed if we don't have a help wiki or are on it
        return true;
    }
    if (!$out->isArticle()) {
        # Do not process for pages other then articles
        return true;
    }
    wfProfileIn(__METHOD__);
    # Do not process if explicitly told not to
    $mw = MagicWord::get('MAG_NOSHAREDHELP');
    if ($mw->match($text) || strpos($text, NOSHAREDHELP_MARKER) !== false) {
        wfProfileOut(__METHOD__);
        return true;
    }
    if ($wgTitle->getNamespace() == NS_HELP) {
        # Initialize shared and local variables
        # Canonical namespace is added here in case we ever want to share other namespaces (e.g. Advice)
        $sharedArticleKey = $wgSharedDB . ':sharedArticles:' . $wgHelpWikiId . ':' . MWNamespace::getCanonicalName($wgTitle->getNamespace()) . ':' . $wgTitle->getDBkey() . ':' . SHAREDHELP_CACHE_VERSION;
        $sharedArticle = $wgMemc->get($sharedArticleKey);
        $sharedServer = WikiFactory::getVarValueByName('wgServer', $wgHelpWikiId);
        $sharedScript = WikiFactory::getVarValueByName('wgScript', $wgHelpWikiId);
        $sharedArticlePath = WikiFactory::getVarValueByName('wgArticlePath', $wgHelpWikiId);
        // get defaults
        // in case anybody's curious: no, we can't use $wgScript cause that may be overridden locally :/
        // @TODO pull this from somewhere instead of hardcoding
        if (empty($sharedArticlePath)) {
            $sharedArticlePath = '/wiki/$1';
        }
        if (empty($sharedScript)) {
            $sharedScript = '/index.php';
        }
        $sharedArticlePathClean = str_replace('$1', '', $sharedArticlePath);
        $localArticlePathClean = str_replace('$1', '', $wgArticlePath);
        # Try to get content from memcache
        if (!empty($sharedArticle['timestamp'])) {
            if (wfTimestamp() - (int) $sharedArticle['timestamp'] < 600) {
                if (isset($sharedArticle['exists']) && $sharedArticle['exists'] == 0) {
                    wfProfileOut(__METHOD__);
                    return true;
                } else {
                    if (!empty($sharedArticle['cachekey'])) {
                        wfDebug("SharedHelp: trying parser cache {$sharedArticle['cachekey']}\n");
                        $key1 = str_replace('-1!', '-0!', $sharedArticle['cachekey']);
                        $key2 = str_replace('-0!', '-1!', $sharedArticle['cachekey']);
                        $parser = $wgMemc->get($key1);
                        if (!empty($parser) && is_object($parser)) {
                            $content = $parser->mText;
                        } else {
                            $parser = $wgMemc->get($key2);
                            if (!empty($parser) && is_object($parser)) {
                                $content = $parser->mText;
                            }
                        }
                    }
                }
            }
        }
        # If getting content from memcache failed (invalidate) then just download it via HTTP
        if (empty($content)) {
            $urlTemplate = $sharedServer . $sharedScript . "?title=Help:%s&action=render";
            $articleUrl = sprintf($urlTemplate, urlencode($wgTitle->getDBkey()));
            list($content, $c) = SharedHttp::get($articleUrl);
            # if we had redirect, then store it somewhere
            if (curl_getinfo($c, CURLINFO_HTTP_CODE) == 301) {
                if (preg_match("/^Location: ([^\n]+)/m", $content, $dest_url)) {
                    $destinationUrl = $dest_url[1];
                }
            }
            global $wgServer, $wgArticlePath, $wgRequest, $wgTitle;
            $helpNs = $wgContLang->getNsText(NS_HELP);
            $sk = RequestContext::getMain()->getSkin();
            if (!empty($_SESSION['SH_redirected'])) {
                $from_link = Title::newfromText($helpNs . ":" . $_SESSION['SH_redirected']);
                $redir = $sk->makeKnownLinkObj($from_link, '', 'redirect=no', '', '', 'rel="nofollow"');
                $s = wfMsg('redirectedfrom', $redir);
                $out->setSubtitle($s);
                $_SESSION['SH_redirected'] = '';
            }
            if (isset($destinationUrl)) {
                $destinationPageIndex = strpos($destinationUrl, "{$helpNs}:");
                # if $helpNs was not found, assume we're on help.wikia.com and try again
                if ($destinationPageIndex === false) {
                    $destinationPageIndex = strpos($destinationUrl, MWNamespace::getCanonicalName(NS_HELP) . ":");
                }
                $destinationPage = substr($destinationUrl, $destinationPageIndex);
                $link = $wgServer . str_replace("\$1", $destinationPage, $wgArticlePath);
                if ('no' != $wgRequest->getVal('redirect')) {
                    $_SESSION['SH_redirected'] = $wgTitle->getText();
                    $out->redirect($link);
                    $wasRedirected = true;
                } else {
                    $content = "\n\n" . wfMsg('shared_help_was_redirect', "<a href=" . $link . ">{$destinationPage}</a>");
                }
            } else {
                $tmp = explode("\r\n\r\n", $content, 2);
                $content = isset($tmp[1]) ? $tmp[1] : '';
            }
            if (strpos($content, '"noarticletext"') > 0) {
                $sharedArticle = array('exists' => 0, 'timestamp' => wfTimestamp());
                $wgMemc->set($sharedArticleKey, $sharedArticle);
                wfProfileOut(__METHOD__);
                return true;
            } else {
                $contentA = explode("\n", $content);
                $tmp = isset($contentA[count($contentA) - 2]) ? $contentA[count($contentA) - 2] : '';
                $idx1 = strpos($tmp, 'key');
                $idx2 = strpos($tmp, 'end');
                $key = trim(substr($tmp, $idx1 + 4, $idx2 - $idx1));
                $sharedArticle = array('cachekey' => $key, 'timestamp' => wfTimestamp());
                $wgMemc->set($sharedArticleKey, $sharedArticle);
                wfDebug("SharedHelp: using parser cache {$sharedArticle['cachekey']}\n");
            }
            curl_close($c);
        }
        if (empty($content)) {
            wfProfileOut(__METHOD__);
            return true;
        } else {
            // So we don't return 404s for local requests to these pages as they have content (BugID: 44611)
            $out->setStatusCode(200);
        }
        //process article if not redirected before
        if (empty($wasRedirected)) {
            # get rid of editsection links
            $content = preg_replace("|<span class=\"editsection( .*)?\"><a href=\".*?\" title=\".*?\">.*?<\\/a><\\/span>|", "", $content);
            $content = strtr($content, array('showTocToggle();' => "showTocToggle('sharedtoctitle', 'sharedtoc', 'sharedtogglelink');", '<table id="toc" class="toc"' => '<table id="sharedtoc" class="toc"', '<div id="toctitle">' => '<div id="sharedtoctitle" class="toctitle">', 'data-image-name' => 'data-shared-help="true" data-image-name'));
            # namespaces to skip when replacing links
            $skipNamespaces = array();
            $skipNamespaces[] = $wgContLang->getNsText(NS_CATEGORY);
            $skipNamespaces[] = $wgContLang->getNsText(NS_IMAGE);
            $skipNamespaces[] = $wgContLang->getNsText(NS_FILE);
            if (defined('NS_VIDEO')) {
                $skipNamespaces[] = $wgContLang->getNsText(NS_VIDEO);
            }
            $skipNamespaces[] = "Advice";
            if ($wgLanguageCode != 'en') {
                $skipNamespaces[] = MWNamespace::getCanonicalName(NS_CATEGORY);
                $skipNamespaces[] = MWNamespace::getCanonicalName(NS_IMAGE);
                if (defined('NS_VIDEO')) {
                    $skipNamespaces[] = MWNamespace::getCanonicalName(NS_VIDEO);
                }
            }
            # replace help wiki links with local links, except for special namespaces defined above
            $content = preg_replace("|{$sharedServer}{$sharedArticlePathClean}(?!" . implode(")(?!", $skipNamespaces) . ")|", $localArticlePathClean, $content);
            # replace help wiki project namespace with local project namespace
            $sharedMetaNamespace = WikiFactory::getVarValueByName('wgMetaNamespace', $wgHelpWikiId);
            if (empty($sharedMetaNamespace)) {
                # use wgSitename if empty, per MW docs
                $sharedMetaNamespace = WikiFactory::getVarValueByName('wgSitename', $wgHelpWikiId);
                $sharedMetaNamespace = str_replace(' ', '_', $sharedMetaNamespace);
            }
            if (!empty($sharedMetaNamespace)) {
                global $wgMetaNamespace;
                $content = preg_replace("|{$localArticlePathClean}{$sharedMetaNamespace}|", $localArticlePathClean . $wgMetaNamespace, $content);
            }
            /* Tomasz Odrobny #36016 */
            $sharedRedirectsArticlesKey = wfSharedMemcKey('sharedRedirectsArticles', $wgHelpWikiId, MWNamespace::getCanonicalName($wgTitle->getNamespace()), $wgTitle->getDBkey());
            $articleLink = $wgMemc->get($sharedRedirectsArticlesKey, null);
            if ($articleLink == null) {
                $articleLink = MWNamespace::getCanonicalName(NS_HELP_TALK) . ':' . $wgTitle->getDBkey();
                $apiUrl = $sharedServer . "/api.php?action=query&redirects&format=json&titles=" . $articleLink;
                $file = @file_get_contents($apiUrl, FALSE);
                $APIOut = json_decode($file);
                if (isset($APIOut->query) && isset($APIOut->query->redirects) && count($APIOut->query->redirects) > 0) {
                    $articleLink = str_replace(" ", "_", $APIOut->query->redirects[0]->to);
                }
                $wgMemc->set($sharedRedirectsArticlesKey, $articleLink, 60 * 60 * 12);
            }
            $helpSitename = WikiFactory::getVarValueByName('wgSitename', $wgHelpWikiId);
            // "this text is stored..."
            $info = '<div class="sharedHelpInfo plainlinks" style="text-align: right; font-size: smaller;padding: 5px">' . wfMsgExt('shared_help_info', 'parseinline', $sharedServer . $sharedArticlePathClean . $articleLink, $helpSitename) . '</div>';
            if (strpos($text, '"noarticletext"') > 0) {
                $text = '<div style="border: solid 1px; padding: 10px; margin: 5px" class="sharedHelp">' . $info . $content . '<div style="clear:both"></div></div>';
            } else {
                $text = $text . '<div style="border: solid 1px; padding: 10px; margin: 5px" class="sharedHelp">' . $info . $content . '<div style="clear:both"></div></div>';
            }
        }
    }
    wfProfileOut(__METHOD__);
    return true;
}
 public static function replaceSubtitle(&$subpages, $skin = null, OutputPage $out)
 {
     if (!TranslatablePage::isTranslationPage($out->getTitle()) && !TranslatablePage::isSourcePage($out->getTitle())) {
         return true;
     }
     // Copied from Skin::subPageSubtitle()
     if ($out->isArticle() && MWNamespace::hasSubpages($out->getTitle()->getNamespace())) {
         $ptext = $out->getTitle()->getPrefixedText();
         if (preg_match('/\\//', $ptext)) {
             $links = explode('/', $ptext);
             array_pop($links);
             // Also pop of one extra for language code is needed
             if (TranslatablePage::isTranslationPage($out->getTitle())) {
                 array_pop($links);
             }
             $c = 0;
             $growinglink = '';
             $display = '';
             foreach ($links as $link) {
                 $growinglink .= $link;
                 $display .= $link;
                 $linkObj = Title::newFromText($growinglink);
                 if (is_object($linkObj) && $linkObj->exists()) {
                     $getlink = Linker::linkKnown(SpecialPage::getTitleFor('MyLanguage', $growinglink), htmlspecialchars($display));
                     $c++;
                     if ($c > 1) {
                         $subpages .= wfMessage('pipe-separator')->plain();
                     } else {
                         // This one is stupid imho, doesn't work with chihuahua
                         // $subpages .= '&lt; ';
                     }
                     $subpages .= $getlink;
                     $display = '';
                 } else {
                     $display .= '/';
                 }
                 $growinglink .= '/';
             }
         }
         return false;
     }
     return true;
 }
 public static function onOutputPageBeforeHTML(OutputPage $out, &$text)
 {
     global $wgRequest;
     if ($out->isArticle() && $wgRequest->getVal('diff') === null && !F::app()->checkSkin('wikiamobile')) {
         $text .= F::app()->renderView('RelatedPages', 'Index');
     }
     return true;
 }
 /**
  * Display Related Discussion (Forum posts) in bottom of article
  * @param OutputPage $out
  * @param string $text article HTML
  * @return bool: true because it is a hook
  */
 public static function onOutputPageBeforeHTML(OutputPage $out, &$text)
 {
     $app = F::app();
     $title = $out->getTitle();
     if ($out->isArticle() && $title->exists() && $title->getNamespace() == NS_MAIN && !Wikia::isMainPage() && $out->getRequest()->getVal('diff') === null && $out->getRequest()->getVal('action') !== 'render' && !$app->checkSkin('wikiamobile', $out->getSkin())) {
         // VOLDEV-46: Omit zero-state, only render if there are related forum threads
         $messages = RelatedForumDiscussionController::getData($title->getArticleId());
         unset($messages['lastupdate']);
         if (!empty($messages)) {
             $text .= $app->renderView('RelatedForumDiscussionController', 'index', array('messages' => $messages));
         }
     }
     return true;
 }
Example #6
0
 /**
  * @param OutputPage $out
  * @param            $text
  *
  * Add needed messages to page and add JS assets
  *
  * @return bool
  */
 public static function onOutputPageBeforeHTML(OutputPage $out, &$text)
 {
     $app = F::app();
     $wg = $app->wg;
     $request = $app->wg->Request;
     $title = $wg->Title;
     $am = AssetsManager::getInstance();
     $relatedPagesGroupName = 'relatedpages_js';
     if ($out->isArticle() && $request->getVal('action', 'view') == 'view') {
         JSMessages::enqueuePackage('RelatedPages', JSMessages::INLINE);
         if (!(Wikia::isMainPage() || !empty($title) && !in_array($title->getNamespace(), $wg->ContentNamespaces)) && !$app->checkSkin('wikiamobile') && $am->checkIfGroupForSkin($relatedPagesGroupName, $out->getSkin())) {
             if ($app->checkSkin('oasis')) {
                 OasisController::addSkinAssetGroup($relatedPagesGroupName);
             } else {
                 $scripts = $am->getURL($relatedPagesGroupName);
                 foreach ($scripts as $script) {
                     $wg->Out->addScript("<script src='{$script}'></script>");
                 }
             }
         }
     }
     return true;
 }