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; }
/** * @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 .= '< '; } $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; }
/** * @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; }