/**
	 * 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 ) );
	}
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;
}
 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('&lt; ' . \Linker::link($title));
 }