/** * @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; }
/** * @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; }
/** * 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; }