Пример #1
0
 /**
  * @since 1.1
  *
  * @param EditPage $editor
  * @param OutputPage &$out
  *
  * @return true
  */
 public function onEditConflict(EditPage &$editor, OutputPage &$out)
 {
     $conctext = $editor->textbox1;
     $actualtext = $editor->textbox2;
     $initialtext = $editor->getBaseRevision()->mText;
     // TODO: WTF?!
     $editor->mArticle->doEdit($actualtext, $editor->summary, $editor->minoredit ? EDIT_MINOR : 0);
     $query = Title::newFromRedirect($actualtext) === null ? '' : 'redirect=no';
     $out->redirect($editor->mTitle->getFullURL($query));
     return true;
 }
Пример #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;
}
Пример #3
0
 /**
  * After we've either updated or inserted the article, update
  * the link tables and redirect to the new page.
  */
 function showArticle($text, $subtitle, $sectionanchor = '')
 {
     global $wgUseDumbLinkUpdate, $wgAntiLockFlags, $wgOut, $wgUser, $wgLinkCache, $wgEnotif;
     global $wgUseEnotif;
     $fname = 'Article::showArticle';
     wfProfileIn($fname);
     $wgLinkCache = new LinkCache();
     if (!$wgUseDumbLinkUpdate) {
         # Preload links to reduce lock time
         if ($wgAntiLockFlags & ALF_PRELOAD_LINKS) {
             $wgLinkCache->preFill($this->mTitle);
             $wgLinkCache->clear();
         }
     }
     # Parse the text and replace links with placeholders
     $wgOut = new OutputPage();
     # Pass the current title along in case we're creating a wiki page
     # which is different than the currently displayed one (e.g. image
     # pages created on file uploads); otherwise, link updates will
     # go wrong.
     $wgOut->addWikiTextWithTitle($text, $this->mTitle);
     if (!$wgUseDumbLinkUpdate) {
         # Move the current links back to the second register
         $wgLinkCache->swapRegisters();
         # Get old version of link table to allow incremental link updates
         # Lock this data now since it is needed for an update
         $wgLinkCache->forUpdate(true);
         $wgLinkCache->preFill($this->mTitle);
         # Swap this old version back into its rightful place
         $wgLinkCache->swapRegisters();
     }
     if ($this->isRedirect($text)) {
         $r = 'redirect=no';
     } else {
         $r = '';
     }
     $wgOut->redirect($this->mTitle->getFullURL($r) . $sectionanchor);
     wfProfileOut($fname);
 }
 private function redirectToOriginalImage(OutputPage $out)
 {
     $paths = $this->paths;
     if (!$paths->originalImagesFullPathIsConstructableFromScan()) {
         return true;
     }
     $web_link_initial_upload_path = $paths->getWebLinkOriginalImagesPath();
     return $out->redirect($web_link_initial_upload_path);
 }
	protected function showSettings( $step ) {
		global $wgRequest, $wgLang;

		$header = new HtmlTag( 'h2' );
		$step_message = 'translate-fs-settings-title';
		$header->style( 'opacity', 0.4 )->content( wfMsg( $step_message ) );

		if ( $step ) {
			$this->out->addHtml( $header );
			return $step;
		}

		if ( $wgRequest->wasPosted() &&
			$this->user->matchEditToken( $wgRequest->getVal( 'token' ) ) &&
			$wgRequest->getText( 'step' ) === 'settings' )
		{
			$this->user->setOption( 'language', $wgRequest->getVal( 'primary-language' ) );
			$this->user->setOption( 'translate-firststeps', '1' );

			$assistant = array();
			for ( $i = 0; $i < 10; $i++ ) {
				$language = $wgRequest->getText( "assistant-language-$i", '-' );
				if ( $language === '-' ) continue;
				$assistant[] = $language;
			}

			if ( count( $assistant ) ) {
				$this->user->setOption( 'translate-editlangs', implode( ',', $assistant ) );
			}
			$this->user->saveSettings();
			// Reload the page if language changed, just in case and this is the easieast way
			$this->out->redirect( $this->getTitle()->getLocalUrl() );
		}

		if ( $this->user->getOption( 'translate-firststeps' ) === '1' ) {
			$header->content( $header->content . wfMsg( 'translate-fs-pagetitle-done' ) );
			$this->out->addHtml( $header );
			return $step;
		}

		$this->out->addHtml( $header->style( 'opacity', false ) );

		$code = $wgLang->getCode();

		$languages = $this->languages( $code );
		$selector = new XmlSelect();
		$selector->addOptions( $languages );
		$selector->setDefault( $code );

		$output = Html::openElement( 'form', array( 'method' => 'post' ) );
		$output .= Html::hidden( 'step', 'settings' );
		$output .= Html::hidden( 'token', $this->user->editToken() );
		$output .= Html::hidden( 'title', $this->getTitle() );
		$output .= Html::openElement( 'table' );

		$name = $id = 'primary-language';
		$selector->setAttribute( 'id', $id );
		$selector->setAttribute( 'name', $name );
		$text = wfMessage( 'translate-fs-settings-planguage' )->text();
		$row  = self::wrap( 'td', Xml::label( $text, $id ) );
		$row .= self::wrap( 'td', $selector->getHtml() );
		$output .= self::wrap( 'tr', $row );

		$row = Html::rawElement( 'td', array( 'colspan' => 2 ), wfMessage( 'translate-fs-settings-planguage-desc' )->parse() );
		$output .= self::wrap( 'tr', $row );

		$helpers = $this->getHelpers( $this->user, $code );

		$selector = new XmlSelect();
		$selector->addOption( wfMessage( 'translate-fs-selectlanguage' )->text(), '-' );
		$selector->addOptions( $languages );

		$num = max( 2, count( $helpers ) );
		for ( $i = 0; $i < $num; $i++ ) {
			$id = $name = "assistant-language-$i";
			$text = wfMessage( 'translate-fs-settings-slanguage' )->numParams( $i + 1 )->text();
			$selector->setDefault( isset( $helpers[$i] ) ? $helpers[$i] : false );
			$selector->setAttribute( 'id', $id );
			$selector->setAttribute( 'name', $name );

			$row  = self::wrap( 'td', Xml::label( $text, $id ) );
			$row .= self::wrap( 'td', $selector->getHtml() );
			$output .= self::wrap( 'tr', $row );
		}

		$output .= Html::openElement( 'tr' );
		$output .= Html::rawElement( 'td', array( 'colspan' => 2 ), wfMessage( 'translate-fs-settings-slanguage-desc' )->parse() );
		$output .= Html::closeElement( 'tr' );
		$output .= Html::openElement( 'tr' );
		$output .= Html::rawElement( 'td', array( 'colspan' => 2 ), Xml::submitButton( wfMsg( 'translate-fs-settings-submit' ) ) );
		$output .= Html::closeElement( 'tr' );
		$output .= Html::closeElement( 'table' );
		$output .= Html::closeElement( 'form' );

		$this->out->addHtml( $output );

		return $step_message;
	}