/** * Overrides parent class. Meant to be used in rss feed. * Currently return the article, its debatable if thats a good idea * or not, but not sure of what better to do. Could regex the wikitext * and try to return the first paragraph, but thats iffy. * * Note, this is only called by the atom/rss feed output, not by * the sitemap output. * @return String */ public function getDescription() { wfProfileIn(__METHOD__); // This is probably rather inefficient to do for several pages // but not much worse than the rest of this extension. $result = ''; $req = new FauxRequest(array('action' => 'parse', 'page' => $this->titleObj->getPrefixedDBKey(), 'prop' => 'text')); $main = new ApiMain($req); $main->execute(); $data = $main->getResultData(); if (isset($data['parse']['text']['*'])) { $result = $this->xmlEncode($data['parse']['text']['*']); } wfProfileOut(__METHOD__); return $result; }
public function getContext(Title $title, $skinName) { $wrapper = new GlobalStateWrapper(['wgTitle' => $title]); $wg = F::app()->wg; return $wrapper->wrap(function () use($title, $wg, $skinName) { $wikiFactoryHub = WikiFactoryHub::getInstance(); $hubService = new HubService(); $adPageTypeService = new AdEngine2PageTypeService(); $wikiaPageType = new WikiaPageType(); $sevenOneMediaCombinedUrl = null; if (!empty($wg->AdDriverUseSevenOneMedia)) { // TODO: implicitly gets the skin from the context! $sevenOneMediaCombinedUrl = ResourceLoader::makeCustomURL($wg->Out, ['wikia.ext.adengine.sevenonemedia'], 'scripts'); } $monetizationServiceAds = null; if (!empty($wg->AdDriverUseMonetizationService) && !empty($wg->EnableMonetizationModuleExt)) { $monetizationServiceAds = F::app()->sendRequest('MonetizationModule', 'index')->getData()['data']; } $langCode = $title->getPageLanguage()->getCode(); return ['opts' => $this->filterOutEmptyItems(['adsInContent' => $wg->EnableAdsInContent, 'delayBtf' => $wg->AdDriverDelayBelowTheFold, 'enableAdsInMaps' => $wg->AdDriverEnableAdsInMaps, 'pageType' => $adPageTypeService->getPageType(), 'paidAssetDropConfig' => $wg->PaidAssetDropConfig, 'showAds' => $adPageTypeService->areAdsShowableOnPage(), 'trackSlotState' => $wg->AdDriverTrackState, 'usePostScribe' => $wg->Request->getBool('usepostscribe', false)]), 'targeting' => $this->filterOutEmptyItems(['enablePageCategories' => array_search($langCode, $wg->AdPageLevelCategoryLangs) !== false, 'pageArticleId' => $title->getArticleId(), 'pageIsArticle' => !!$title->getArticleId(), 'pageIsHub' => $wikiaPageType->isWikiaHub(), 'pageName' => $title->getPrefixedDBKey(), 'pageType' => $wikiaPageType->getPageType(), 'sevenOneMediaSub2Site' => $wg->AdDriverSevenOneMediaOverrideSub2Site, 'skin' => $skinName, 'wikiCategory' => $wikiFactoryHub->getCategoryShort($wg->CityId), 'wikiCustomKeyValues' => $wg->DartCustomKeyValues, 'wikiDbName' => $wg->DBname, 'wikiDirectedAtChildren' => $wg->WikiDirectedAtChildrenByFounder || $wg->WikiDirectedAtChildrenByStaff, 'wikiIsCorporate' => $wikiaPageType->isCorporatePage(), 'wikiIsTop1000' => $wg->AdDriverWikiIsTop1000, 'wikiLanguage' => $langCode, 'wikiVertical' => $hubService->getCategoryInfoForCity($wg->CityId)->cat_name]), 'providers' => $this->filterOutEmptyItems(['monetizationService' => $wg->AdDriverUseMonetizationService, 'monetizationServiceAds' => $monetizationServiceAds, 'sevenOneMedia' => $wg->AdDriverUseSevenOneMedia, 'sevenOneMediaCombinedUrl' => $sevenOneMediaCombinedUrl, 'taboola' => $wg->AdDriverUseTaboola]), 'slots' => $this->filterOutEmptyItems(['exitstitial' => $wg->EnableOutboundScreenExt, 'exitstitialRedirectDelay' => $wg->OutboundScreenRedirectDelay, 'invisibleHighImpact' => $wg->AdDriverEnableInvisibleHighImpactSlot]), 'forcedProvider' => $wg->AdDriverForcedProvider]; }); }
/** * Is this page in reviewable namespace? * Note: this checks $wgFlaggedRevsWhitelist * @param Title, $title * @return bool */ public static function inReviewNamespace(Title $title) { global $wgFlaggedRevsWhitelist; if (in_array($title->getPrefixedDBKey(), $wgFlaggedRevsWhitelist)) { return false; // page is one exemption whitelist } $ns = $title->getNamespace() == NS_MEDIA ? NS_FILE : $title->getNamespace(); // treat NS_MEDIA as NS_FILE return in_array($ns, self::getReviewNamespaces()); }
/** * Helper function for getParsedcontent for making subpage section headers * @param $contentItem array of data for the content item we're generating the header for * @return string html (NOTE THIS IS AN OPEN DIV) */ protected function makeHeader(Title $title, array $contentItem) { global $wgParser; static $tocLinks = []; // All used ids for the sections for the toc $linkRenderer = $wgParser->getLinkRenderer(); $spTitle = Title::newFromText($contentItem['title']); $spRev = Revision::newFromTitle($spTitle); // Get display name if (isset($contentItem['displayTitle'])) { $spPage = $contentItem['displayTitle']; } else { $spPage = $spTitle->getSubpageText(); } // Generate an id for the section for anchors // Make sure this matches the ToC anchor generation $spPageLink = Sanitizer::escapeId(htmlspecialchars($spPage)); $spPageLink2 = $spPageLink; $spPageLinkCounter = 1; while (in_array($spPageLink2, $tocLinks)) { $spPageLink2 = $spPageLink . $spPageLinkCounter; $spPageLinkCounter++; } $tocLinks[] = $spPageLink2; // Get editsection-style links for the subpage $sectionLinks = []; $sectionLinksText = ''; if (isset($spRev)) { $sectionLinks['viewLink'] = $linkRenderer->makeLink($spTitle, wfMessage('collaborationkit-hub-subpage-view')->inContentLanguage()->text()); } if ($spTitle->userCan('edit')) { if (isset($spRev)) { $linkString = 'edit'; // TODO get appropriate edit link if it's something weird $sectionLinks['edit'] = $linkRenderer->makeLink($spTitle, wfMessage($linkString)->inContentLanguage()->text(), [], ['action' => 'edit']); } else { $linkString = 'create'; $sectionLinks['edit'] = $linkRenderer->makeLink(SpecialPage::getTitleFor('CreateHubFeature'), wfMessage($linkString)->inContentLanguage()->text(), [], ['collaborationhub' => $title->getPrefixedDBKey(), 'feature' => $spTitle->getSubpageText()]); } } if ($title->userCan('edit')) { $sectionLinks['removeLink'] = $linkRenderer->makeLink($title, wfMessage('collaborationkit-hub-subpage-remove')->inContentLanguage()->text(), [], ['action' => 'edit']); } foreach ($sectionLinks as $sectionLink) { $sectionLinksText .= $this->makeEditSectionLink($sectionLink); } $sectionLinksText = Html::rawElement('span', ['class' => 'mw-editsection'], $sectionLinksText); // Assemble header // Open general section here since we have the id here $html = Html::openElement('div', ['class' => 'mw-ck-hub-section', 'id' => $spPageLink2]); $html .= Html::rawElement('h2', [], Html::element('span', ['class' => 'mw-headline'], $spPage) . $sectionLinksText); OutputPage::setupOOUI(); return $html; }
/** * Get "create new repo" form * @return String */ private function getForm() { global $wgScript; return Xml::fieldset(wfMsg('repoadmin-new-legend')) . Xml::openElement('form', array('method' => 'get', 'action' => $wgScript)) . Html::hidden('title', $this->title->getPrefixedDBKey()) . Xml::inputLabel(wfMsg('repoadmin-new-label'), 'repo', 'repo') . Xml::submitButton(wfMsg('repoadmin-new-button')) . '</form></fieldset>'; }
/** * Get an array containing the variables to be set in mw.config in JavaScript. * * DO NOT CALL THIS FROM OUTSIDE OF THIS CLASS OR Skin::makeGlobalVariablesScript(). * This is only public until that function is removed. You have been warned. * * Do not add things here which can be evaluated in ResourceLoaderStartupScript * - in other words, page-independent/site-wide variables (without state). * You will only be adding bloat to the html page and causing page caches to * have to be purged on configuration changes. * @return array */ public function getJSVars() { global $wgUseAjax, $wgEnableMWSuggest; $latestRevID = 0; $pageID = 0; $canonicalName = false; # bug 21115 $title = $this->getTitle(); $ns = $title->getNamespace(); $nsname = MWNamespace::exists($ns) ? MWNamespace::getCanonicalName($ns) : $title->getNsText(); // Get the relevant title so that AJAX features can use the correct page name // when making API requests from certain special pages (bug 34972). $relevantTitle = $this->getSkin()->getRelevantTitle(); if ($ns == NS_SPECIAL) { list($canonicalName, ) = SpecialPageFactory::resolveAlias($title->getDBkey()); } elseif ($this->canUseWikiPage()) { $wikiPage = $this->getWikiPage(); $latestRevID = $wikiPage->getLatest(); $pageID = $wikiPage->getId(); } $lang = $title->getPageLanguage(); // Pre-process information $separatorTransTable = $lang->separatorTransformTable(); $separatorTransTable = $separatorTransTable ? $separatorTransTable : array(); $compactSeparatorTransTable = array(implode("\t", array_keys($separatorTransTable)), implode("\t", $separatorTransTable)); $digitTransTable = $lang->digitTransformTable(); $digitTransTable = $digitTransTable ? $digitTransTable : array(); $compactDigitTransTable = array(implode("\t", array_keys($digitTransTable)), implode("\t", $digitTransTable)); $vars = array('wgCanonicalNamespace' => $nsname, 'wgCanonicalSpecialPageName' => $canonicalName, 'wgNamespaceNumber' => $title->getNamespace(), 'wgPageName' => $title->getPrefixedDBKey(), 'wgTitle' => $title->getText(), 'wgCurRevisionId' => $latestRevID, 'wgArticleId' => $pageID, 'wgIsArticle' => $this->isArticle(), 'wgAction' => Action::getActionName($this->getContext()), 'wgUserName' => $this->getUser()->isAnon() ? null : $this->getUser()->getName(), 'wgUserGroups' => $this->getUser()->getEffectiveGroups(), 'wgCategories' => $this->getCategories(), 'wgBreakFrames' => $this->getFrameOptions() == 'DENY', 'wgPageContentLanguage' => $lang->getCode(), 'wgSeparatorTransformTable' => $compactSeparatorTransTable, 'wgDigitTransformTable' => $compactDigitTransTable, 'wgRelevantPageName' => $relevantTitle->getPrefixedDBKey()); if ($lang->hasVariants()) { $vars['wgUserVariant'] = $lang->getPreferredVariant(); } foreach ($title->getRestrictionTypes() as $type) { $vars['wgRestriction' . ucfirst($type)] = $title->getRestrictions($type); } if ($wgUseAjax && $wgEnableMWSuggest && !$this->getUser()->getOption('disablesuggest', false)) { $vars['wgSearchNamespaces'] = SearchEngine::userNamespaces($this->getUser()); } if ($title->isMainPage()) { $vars['wgIsMainPage'] = true; } if ($this->mRedirectedFrom) { $vars['wgRedirectedFrom'] = $this->mRedirectedFrom->getPrefixedDBKey(); } // Allow extensions to add their custom variables to the mw.config map. // Use the 'ResourceLoaderGetConfigVars' hook if the variable is not // page-dependant but site-wide (without state). // Alternatively, you may want to use OutputPage->addJsConfigVars() instead. wfRunHooks('MakeGlobalVariablesScript', array(&$vars, $this)); // Merge in variables from addJsConfigVars last return array_merge($vars, $this->mJsConfigVars); }
function wfLanguageSelectorHTML(Title $title, $style = null, $class = null, $selectorstyle = null, $buttonstyle = null, $showCode = null) { global $wgLang, $wgContLang, $wgScript, $wgLanguageSelectorShowCode; if ($showCode === null) { $showCode = $wgLanguageSelectorShowCode; } static $id = 0; $id += 1; $code = $wgLang->getCode(); $html = ''; $html .= Xml::openElement('span', array('id' => 'languageselector-box-' . $id, 'class' => 'languageselector ' . $class, 'style' => $style)); $html .= Xml::openElement('form', array('name' => 'languageselector-form-' . $id, 'id' => 'languageselector-form-' . $id, 'method' => 'get', 'action' => $wgScript, 'style' => 'display:inline;')); $html .= Html::Hidden('title', $title->getPrefixedDBKey()); $html .= Xml::openElement('select', array('name' => 'setlang', 'id' => 'languageselector-select-' . $id, 'style' => $selectorstyle)); foreach (wfGetLanguageSelectorLanguages() as $ln) { $name = $wgContLang->getLanguageName($ln); if ($showCode) { $name = wfBCP47($ln) . ' - ' . $name; } $html .= Xml::option($name, $ln, $ln == $code); } $html .= Xml::closeElement('select'); $html .= Xml::submitButton(wfMsg('languageselector-setlang'), array('id' => 'languageselector-commit-' . $id, 'style' => $buttonstyle)); $html .= Xml::closeElement('form'); $html .= Xml::closeElement('span'); return $html; }
/** * Adds a brief feedback form to a page. * @param OutputPage $out * @param bool $top, should this form always go on top? * @param Title $title */ protected static function addQuickFeedback( &$data, $top = false, $title ) { global $wgOut, $wgUser, $wgFeedbackTags; # Are there any reader input tags? if( empty($wgFeedbackTags) ) { return false; } # Revision being displayed $id = $wgOut->getRevisionId(); # Load required messages $reviewTitle = SpecialPage::getTitleFor( 'ReaderFeedback' ); $action = $reviewTitle->getLocalUrl( 'action=submit' ); $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'mw-feedbackform' ) ); $form .= Xml::openElement( 'fieldset', array('class' => 'feedback_reviewform noprint') ); $form .= "<legend><strong>" . wfMsgHtml( 'readerfeedback' ) . "</strong></legend>\n"; # Avoid clutter if( !$wgUser->isAllowed('review') ) { $form .= wfMsgExt( 'readerfeedback-text', array('parse') ); } $form .= Xml::openElement( 'span', array('id' => 'mw-feedbackselects') ); # Loop through all different flag types foreach( ReaderFeedback::getFeedbackTags() as $quality => $levels ) { $selected = ( isset($flags[$quality]) && $flags[$quality] > 0 ) ? $flags[$quality] : -1; $form .= "<b>" . Xml::label( wfMsgHtml("readerfeedback-$quality"), "wp$quality" ) . ":</b>"; $attribs = array( 'name' => "wp$quality", 'id' => "wp$quality", 'onchange' => "updateFeedbackForm()" ); $form .= ' ' . Xml::openElement( 'select', $attribs ); $levels = array_reverse($levels,true); foreach( $levels as $i => $name ) { $optionClass = array( 'class' => "rfb-rating-option-$i" ); $form .= Xml::option( wfMsg("readerfeedback-level-$i"), $i, ($i == $selected), $optionClass ) ."\n"; } $form .= Xml::option( wfMsg("readerfeedback-level-none"), -1, (-1 == $selected) ) ."\n"; $form .= Xml::closeElement( 'select' )."\n"; } $form .= Xml::closeElement( 'span' ); $form .= Xml::submitButton( wfMsg('readerfeedback-submit'), array('id' => 'submitfeedback','accesskey' => wfMsg('readerfeedback-ak-review'), 'title' => wfMsg('readerfeedback-tt-review').' ['.wfMsg('readerfeedback-ak-review').']' ) ); # Hidden params $form .= Html::hidden( 'title', $reviewTitle->getPrefixedText() ) . "\n"; $form .= Html::hidden( 'target', $title->getPrefixedDBKey() ) . "\n"; $form .= Html::hidden( 'oldid', $id ) . "\n"; $form .= Html::hidden( 'validatedParams', ReaderFeedbackPage::validationKey( $id, $wgUser->getId() ) ); $form .= Html::hidden( 'action', 'submit') . "\n"; $form .= Html::hidden( 'wpEditToken', $wgUser->editToken() ) . "\n"; # Honeypot input $form .= Xml::input( 'commentary', 12, '', array('style' => 'display:none;') ) . "\n"; $form .= Xml::closeElement( 'fieldset' ); $form .= Xml::closeElement( 'form' ); if( $top ) { $wgOut->prependHTML( $form ); } else { $data .= $form; } return true; }
/** * Get the DB prefixed title * * @return String the prefixed title, with underscores and * any interwiki and namespace prefixes */ public function getDBPrefixedTitle() { return $this->Title->getPrefixedDBKey(); }
/** * Constructor for a single item in the feed. Requires the URI of the item. */ public function __construct(Title $t, $c, $d) { $this->title = $t; $this->uri = $t->getFullURL(); $this->label = $t->getText(); $article = null; if (count($c) == 0) { $article = new Article($t); $this->creator = array(); $this->creator[] = $article->getUserText(); } else { $this->creator = $c; } $this->date = array(); if (count($d) == 0) { if (is_null($article)) { $article = new Article($t); } $this->date[] = date("c", strtotime($article->getTimestamp())); } else { foreach ($d as $date) { $this->date[] = $date; } } // get content if ($t->getNamespace() == NS_MAIN) { $this->articlename = ':' . $t->getDBkey(); } else { $this->articlename = $t->getPrefixedDBKey(); } }