/** * Set a subtitle like "Manage > FreeCol (open source game) > German" * based on group and language code. The language part is not shown if * it is 'en', and all three possible parts of the subtitle are linked. * * @param $group MessageGroup * @param $code \string Language code. */ protected function setSubtitle( $group, $code ) { global $wgLang; $links[] = $this->skin->link( $this->getTitle(), wfMsgHtml( 'translate-manage-subtitle' ) ); $links[] = $this->skin->link( $this->getTitle(), htmlspecialchars( $group->getLabel() ), array(), array( 'group' => $group->getId() ) ); // Do not show language part for English. if ( $code !== 'en' ) { $langname = TranslateUtils::getLanguageName( $code, false, $wgLang->getCode() ); $links[] = $this->skin->link( $this->getTitle(), htmlspecialchars( $langname ), array(), array( 'group' => $group->getId(), 'language' => $code ) ); } $this->out->setSubtitle( implode( ' > ', $links ) ); }
/** * @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; }
function setTopText(OutputPage $out, FormOptions $opts) { global $wgUser; $skin = $wgUser->getSkin(); if (isset($this->mTargetTitle) && is_object($this->mTargetTitle)) { $out->setSubtitle(wfMsg('recentchangeslinked-backlink', $skin->link($this->mTargetTitle, $this->mTargetTitle->getPrefixedText(), array(), array('redirect' => 'no')))); } }
/** * @param \OutputPage $out */ public function setPageTitle(\OutputPage $out) { $topic = $this->findTopicTitle(); $title = $this->workflow->getOwnerTitle(); $out->setPageTitle($out->msg('flow-topic-first-heading', $title->getPrefixedText())); if ($this->permissions->isAllowed($topic, 'view')) { if ($this->action === 'undo-edit-topic-summary') { $key = 'flow-undo-edit-topic-summary'; } else { $key = 'flow-topic-html-title'; } $out->setHtmlTitle($out->msg($key, array(Message::rawParam($topic->getContent('wikitext')), $title->getPrefixedText()))); } else { $out->setHtmlTitle($title->getPrefixedText()); } $out->setSubtitle('< ' . \Linker::link($title)); }