*
* @ingroup Skins
*/
-abstract class Skin {
+abstract class Skin extends ContextSource {
protected $skinname = 'standard';
protected $mRelevantTitle = null;
protected $mRelevantUser = null;
/**
* Fetch the set of available skins.
- * @return array of strings
+ * @return array associative array of strings
*/
static function getSkinNames() {
global $wgValidSkinNames;
}
return $wgValidSkinNames;
}
+
+ /**
+ * Fetch the skinname messages for available skins.
+ * @return array of strings
+ */
+ static function getSkinNameMessages() {
+ $messages = array();
+ foreach( self::getSkinNames() as $skinKey => $skinName ) {
+ $messages[] = "skinname-$skinKey";
+ }
+ return $messages;
+ }
/**
* Fetch the list of usable skins in regards to $wgSkipSkins.
$skinNames = Skin::getSkinNames();
- if ( $key == '' ) {
+ if ( $key == '' || $key == 'default' ) {
// Don't return the default immediately;
// in a misconfiguration we need to fall back.
$key = $wgDefaultSkin;
}
}
}
- $skin = new $className;
+ $skin = new $className( $key );
return $skin;
}
- /** @return string path to the skin stylesheet */
- function getStylesheet() {
- return 'common/wikistandard.css';
- }
-
/** @return string skin name */
public function getSkinName() {
return $this->skinname;
}
+ /**
+ * @param $out OutputPage
+ */
function initPage( OutputPage $out ) {
wfProfileIn( __METHOD__ );
$this->preloadExistence();
- $this->setMembers();
wfProfileOut( __METHOD__ );
}
* Preload the existence of three commonly-requested pages in a single query
*/
function preloadExistence() {
- $user = $this->getContext()->getUser();
+ $user = $this->getUser();
// User/talk link
$titles = array( $user->getUserPage(), $user->getTalkPage() );
// Other tab link
- if ( $this->getTitle()->getNamespace() == NS_SPECIAL ) {
+ if ( $this->getTitle()->isSpecialPage() ) {
// nothing
} elseif ( $this->getTitle()->isTalkPage() ) {
$titles[] = $this->getTitle()->getSubjectPage();
$lb->execute();
}
- /**
- * Set some local variables
- */
- protected function setMembers() {
- $this->userpage = $this->getContext()->getUser()->getUserPage()->getPrefixedText();
- }
-
- /**
- * Set the RequestContext used in this instance
- *
- * @param RequestContext $context
- */
- public function setContext( RequestContext $context ) {
- $this->mContext = $context;
- }
-
- /**
- * Get the RequestContext used in this instance
- *
- * @return RequestContext
- */
- public function getContext() {
- if ( !isset($this->mContext) ) {
- wfDebug( __METHOD__ . " called and \$mContext is null. Using RequestContext::getMain(); for sanity\n" );
- $this->mContext = RequestContext::getMain();
- }
- return $this->mContext;
- }
-
- /** Get the title
- *
- * @return Title
- */
- public function getTitle() {
- return $this->getContext()->getTitle();
- }
-
- /** Get the user
- *
- * @return User
- */
- public function getUser() {
- return $this->getContext()->getUser();
- }
-
/**
* Get the current revision ID
*
* @return Integer
*/
public function getRevisionId() {
- return $this->getContext()->getOutput()->getRevisionId();
+ return $this->getOutput()->getRevisionId();
}
/**
if ( User::isIP( $rootUser ) ) {
$this->mRelevantUser = User::newFromName( $rootUser, false );
} else {
- $user = User::newFromName( $rootUser );
- if ( $user->isLoggedIn() ) {
+ $user = User::newFromName( $rootUser, false );
+ if ( $user && $user->isLoggedIn() ) {
$this->mRelevantUser = $user;
}
}
* Outputs the HTML generated by other functions.
* @param $out OutputPage
*/
- abstract function outputPage( OutputPage $out );
+ abstract function outputPage( OutputPage $out = null );
+ /**
+ * @param $data array
+ * @return string
+ */
static function makeVariablesScript( $data ) {
if ( $data ) {
return Html::inlineScript(
}
/**
- * To make it harder for someone to slip a user a fake
- * user-JavaScript or user-CSS preview, a random token
- * is associated with the login session. If it's not
- * passed back with the preview request, we won't render
- * the code.
+ * Make a <script> tag containing global variables
*
- * @param $action String: 'edit', 'submit' etc.
- * @return bool
+ * @deprecated in 1.19
+ * @param $unused
+ * @return string HTML fragment
*/
- public function userCanPreview( $action ) {
- if ( $action != 'submit' ) {
- return false;
- }
- if ( !$this->getContext()->getRequest()->wasPosted() ) {
- return false;
- }
- if ( !$this->getTitle()->userCanEditCssSubpage() ) {
- return false;
- }
- if ( !$this->getTitle()->userCanEditJsSubpage() ) {
- return false;
- }
+ public static function makeGlobalVariablesScript( $unused ) {
+ global $wgOut;
- return $this->getContext()->getUser()->matchEditToken(
- $this->getContext()->getRequest()->getVal( 'wpEditToken' ) );
- }
+ wfDeprecated( __METHOD__, '1.19' );
- /**
- * Generated JavaScript action=raw&gen=js
- * This used to load MediaWiki:Common.js and the skin-specific style
- * before the ResourceLoader.
- *
- * @deprecated since 1.18 Use the ResourceLoader instead. This may be removed at some
- * point.
- * @param $skinName String: If set, overrides the skin name
- * @return String
- */
- public function generateUserJs( $skinName = null ) {
- return '';
- }
-
- /**
- * Generate user stylesheet for action=raw&gen=css
- *
- * @deprecated since 1.18 Use the ResourceLoader instead. This may be removed at some
- * point.
- * @return String
- */
- public function generateUserStylesheet() {
- return '';
- }
-
- /**
- * @private
- * @todo document
- * @param $out OutputPage
- */
- function setupUserCss( OutputPage $out ) {
- global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs;
-
- wfProfileIn( __METHOD__ );
-
- $this->setupSkinUserCss( $out );
- // Add any extension CSS
- foreach ( $out->getExtStyle() as $url ) {
- $out->addStyle( $url );
- }
-
- // Per-site custom styles
- if ( $wgUseSiteCss ) {
- $out->addModuleStyles( array( 'site', 'noscript' ) );
- if( $this->getContext()->getUser()->isLoggedIn() ){
- $out->addModuleStyles( 'user.groups' );
- }
- }
-
- // Per-user custom styles
- if ( $wgAllowUserCss ) {
- if ( $this->getTitle()->isCssSubpage() && $this->userCanPreview( $this->getContext()->getRequest()->getVal( 'action' ) ) ) {
- // @todo FIXME: Properly escape the cdata!
- $out->addInlineStyle( $this->getContext()->getRequest()->getText( 'wpTextbox1' ) );
- } else {
- $out->addModuleStyles( 'user' );
- }
- }
-
- // Per-user preference styles
- if ( $wgAllowUserCssPrefs ) {
- $out->addModuleStyles( 'user.options' );
- }
-
- wfProfileOut( __METHOD__ );
+ return self::makeVariablesScript( $wgOut->getJSVars() );
}
/**
/**
* Add skin specific stylesheets
* Calling this method with an $out of anything but the same OutputPage
- * inside ->getContext()->getOutput() is deprecated. The $out arg is kept
+ * inside ->getOutput() is deprecated. The $out arg is kept
* for compatibility purposes with skins.
* @param $out OutputPage
* @delete
* @return String
*/
function getPageClasses( $title ) {
- global $wgRequest;
$numeric = 'ns-' . $title->getNamespace();
- if ( $title->getNamespace() == NS_SPECIAL ) {
+ if ( $title->isSpecialPage() ) {
$type = 'ns-special';
// bug 23315: provide a class based on the canonical special page name without subpages
list( $canonicalName ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
}
$name = Sanitizer::escapeClass( 'page-' . $title->getPrefixedText() );
-
- if ( $wgRequest->getVal('action') ) {
- $action = 'action-' . $wgRequest->getVal('action');
- } else {
- $action = 'action-view';
- }
- return "$numeric $type $name $action";
+
+ return "$numeric $type $name";
}
/**
return $wgLogo;
}
+ /**
+ * @return string
+ */
function getCategoryLinks() {
- global $wgUseCategoryBrowser, $wgContLang;
+ global $wgUseCategoryBrowser;
- $out = $this->getContext()->getOutput();
+ $out = $this->getOutput();
+ $allCats = $out->getCategoryLinks();
- if ( count( $out->mCategoryLinks ) == 0 ) {
+ if ( !count( $allCats ) ) {
return '';
}
- # Separator
- $sep = wfMsgExt( 'catseparator', array( 'parsemag', 'escapenoentities' ) );
+ $embed = "<li>";
+ $pop = "</li>";
- // Use Unicode bidi embedding override characters,
- // to make sure links don't smash each other up in ugly ways.
- $dir = $wgContLang->getDir();
- $embed = "<span dir='$dir'>";
- $pop = '</span>';
-
- $allCats = $out->getCategoryLinks();
$s = '';
- $colon = wfMsgExt( 'colon-separator', 'escapenoentities' );
+ $colon = $this->msg( 'colon-separator' )->escaped();
if ( !empty( $allCats['normal'] ) ) {
- $t = $embed . implode( "{$pop} {$sep} {$embed}" , $allCats['normal'] ) . $pop;
+ $t = $embed . implode( "{$pop}{$embed}" , $allCats['normal'] ) . $pop;
- $msg = wfMsgExt( 'pagecategories', array( 'parsemag', 'escapenoentities' ), count( $allCats['normal'] ) );
- $s .= '<div id="mw-normal-catlinks">' .
- Linker::link( Title::newFromText( wfMsgForContent( 'pagecategorieslink' ) ), $msg )
- . $colon . $t . '</div>';
+ $msg = $this->msg( 'pagecategories', count( $allCats['normal'] ) )->escaped();
+ $linkPage = wfMessage( 'pagecategorieslink' )->inContentLanguage()->text();
+ $s .= '<div id="mw-normal-catlinks" class="mw-normal-catlinks">' .
+ Linker::link( Title::newFromText( $linkPage ), $msg )
+ . $colon . '<ul>' . $t . '</ul>' . '</div>';
}
# Hidden categories
if ( isset( $allCats['hidden'] ) ) {
- if ( $this->getContext()->getUser()->getBoolOption( 'showhiddencats' ) ) {
- $class = 'mw-hidden-cats-user-shown';
+ if ( $this->getUser()->getBoolOption( 'showhiddencats' ) ) {
+ $class = ' mw-hidden-cats-user-shown';
} elseif ( $this->getTitle()->getNamespace() == NS_CATEGORY ) {
- $class = 'mw-hidden-cats-ns-shown';
+ $class = ' mw-hidden-cats-ns-shown';
} else {
- $class = 'mw-hidden-cats-hidden';
+ $class = ' mw-hidden-cats-hidden';
}
- $s .= "<div id=\"mw-hidden-catlinks\" class=\"$class\">" .
- wfMsgExt( 'hidden-categories', array( 'parsemag', 'escapenoentities' ), count( $allCats['hidden'] ) ) .
- $colon . $embed . implode( "$pop $sep $embed", $allCats['hidden'] ) . $pop .
+ $s .= "<div id=\"mw-hidden-catlinks\" class=\"mw-hidden-catlinks$class\">" .
+ $this->msg( 'hidden-categories', count( $allCats['hidden'] ) )->escaped() .
+ $colon . '<ul>' . $embed . implode( "{$pop}{$embed}" , $allCats['hidden'] ) . $pop . '</ul>' .
'</div>';
}
# add our current element to the list
$eltitle = Title::newFromText( $element );
- $return .= Linker::link( $eltitle, $eltitle->getText() );
+ $return .= Linker::link( $eltitle, htmlspecialchars( $eltitle->getText() ) );
}
return $return;
}
+ /**
+ * @return string
+ */
function getCategories() {
- $out = $this->getContext()->getOutput();
+ $out = $this->getOutput();
$catlinks = $this->getCategoryLinks();
// Check what we're showing
$allCats = $out->getCategoryLinks();
- $showHidden = $this->getContext()->getUser()->getBoolOption( 'showhiddencats' ) ||
+ $showHidden = $this->getUser()->getBoolOption( 'showhiddencats' ) ||
$this->getTitle()->getNamespace() == NS_CATEGORY;
if ( empty( $allCats['normal'] ) && !( !empty( $allCats['hidden'] ) && $showHidden ) ) {
protected function generateDebugHTML() {
global $wgShowDebug;
+ $html = MWDebug::getDebugHTML( $this->getContext() );
+
if ( $wgShowDebug ) {
- $listInternals = $this->formatDebugHTML( $this->getContext()->getOutput()->mDebugtext );
- return "\n<hr />\n<strong>Debug data:</strong><ul id=\"mw-debug-html\">" .
+ $listInternals = $this->formatDebugHTML( $this->getOutput()->mDebugtext );
+ $html .= "\n<hr />\n<strong>Debug data:</strong><ul id=\"mw-debug-html\">" .
$listInternals . "</ul>\n";
}
- return '';
+ return $html;
}
+ /**
+ * @param $debugText string
+ * @return string
+ */
private function formatDebugHTML( $debugText ) {
global $wgDebugTimestamps;
$pre = '';
if ( $wgDebugTimestamps ) {
$matches = array();
- if ( preg_match( '/^(\d+\.\d+\s{2})/', $line, $matches ) ) {
+ if ( preg_match( '/^(\d+\.\d+ {1,3}\d+.\dM\s{2})/', $line, $matches ) ) {
$pre = $matches[1];
$line = substr( $line, strlen( $pre ) );
}
/**
* This gets called shortly before the </body> tag.
- * @param $out OutputPage object
+ *
* @return String HTML-wrapped JS code to be put before </body>
*/
- function bottomScripts( $out ) {
+ function bottomScripts() {
// TODO and the suckage continues. This function is really just a wrapper around
// OutputPage::getBottomScripts() which takes a Skin param. This should be cleaned
// up at some point
- $bottomScriptText = $out->getBottomScripts( $this );
+ $bottomScriptText = $this->getOutput()->getBottomScripts();
wfRunHooks( 'SkinAfterBottomScripts', array( $this, &$bottomScriptText ) );
return $bottomScriptText;
}
- /** @return string Retrievied from HTML text */
+ /**
+ * Text with the permalink to the source page,
+ * usually shown on the footer of a printed page
+ *
+ * @return string HTML text with an URL
+ */
function printSource() {
- $url = htmlspecialchars( $this->getTitle()->getFullURL() );
- return wfMsg( 'retrievedfrom', '<a href="' . $url . '">' . $url . '</a>' );
+ $oldid = $this->getRevisionId();
+ if ( $oldid ) {
+ $url = htmlspecialchars( $this->getTitle()->getCanonicalURL( 'oldid=' . $oldid ) );
+ } else {
+ // oldid not available for non existing pages
+ $url = htmlspecialchars( $this->getTitle()->getCanonicalURL() );
+ }
+ return $this->msg( 'retrievedfrom', '<a href="' . $url . '">' . $url . '</a>' )->text();
}
+ /**
+ * @return String
+ */
function getUndeleteLink() {
- $action = $this->getContext()->getRequest()->getVal( 'action', 'view' );
+ $action = $this->getRequest()->getVal( 'action', 'view' );
- if ( $this->getContext()->getUser()->isAllowed( 'deletedhistory' ) &&
+ if ( $this->getUser()->isAllowed( 'deletedhistory' ) &&
( $this->getTitle()->getArticleId() == 0 || $action == 'history' ) ) {
+ $n = $this->getTitle()->isDeleted();
- $includeSuppressed = $this->getContext()->getUser()->isAllowed( 'suppressrevision' );
- $n = $this->getTitle()->isDeleted( $includeSuppressed );
if ( $n ) {
- if ( $this->getContext()->getUser()->isAllowed( 'undelete' ) ) {
+ if ( $this->getUser()->isAllowed( 'undelete' ) ) {
$msg = 'thisisdeleted';
} else {
$msg = 'viewdeleted';
}
- return wfMsg(
- $msg,
- Linker::link(
+ return $this->msg( $msg )->rawParams(
+ Linker::linkKnown(
SpecialPage::getTitleFor( 'Undelete', $this->getTitle()->getPrefixedDBkey() ),
- wfMsgExt( 'restorelink', array( 'parsemag', 'escape' ), $this->getContext()->getLang()->formatNum( $n ) ),
- array(),
- array(),
- array( 'known', 'noclasses' )
- )
- );
+ $this->msg( 'restorelink' )->numParams( $n )->escaped() )
+ )->text();
}
}
return '';
}
+ /**
+ * @return string
+ */
function subPageSubtitle() {
- $out = $this->getContext()->getOutput();
+ $out = $this->getOutput();
$subpages = '';
if ( !wfRunHooks( 'SkinSubPageSubtitle', array( &$subpages, $this, $out ) ) ) {
$linkObj = Title::newFromText( $growinglink );
if ( is_object( $linkObj ) && $linkObj->exists() ) {
- $getlink = $this->link(
+ $getlink = Linker::linkKnown(
$linkObj,
- htmlspecialchars( $display ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ htmlspecialchars( $display )
);
$c++;
if ( $c > 1 ) {
- $subpages .= wfMsgExt( 'pipe-separator', 'escapenoentities' );
+ $subpages .= $this->msg( 'pipe-separator' )->escaped();
} else {
$subpages .= '< ';
}
return $wgShowIPinHeader && session_id() != '';
}
+ /**
+ * @return String
+ */
function getSearchLink() {
$searchPage = SpecialPage::getTitleFor( 'Search' );
return $searchPage->getLocalURL();
}
+ /**
+ * @return string
+ */
function escapeSearchLink() {
return htmlspecialchars( $this->getSearchLink() );
}
+ /**
+ * @param $type string
+ * @return string
+ */
function getCopyright( $type = 'detect' ) {
- global $wgRightsPage, $wgRightsUrl, $wgRightsText;
+ global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgContLang;
if ( $type == 'detect' ) {
- $diff = $this->getContext()->getRequest()->getVal( 'diff' );
-
- if ( is_null( $diff ) && !$this->isRevisionCurrent() && wfMsgForContent( 'history_copyright' ) !== '-' ) {
+ if ( !$this->isRevisionCurrent() && !$this->msg( 'history_copyright' )->inContentLanguage()->isDisabled() ) {
$type = 'history';
} else {
$type = 'normal';
$msg = 'copyright';
}
- $out = '';
-
if ( $wgRightsPage ) {
$title = Title::newFromText( $wgRightsPage );
$link = Linker::linkKnown( $title, $wgRightsText );
$link = $wgRightsText;
} else {
# Give up now
- return $out;
+ return '';
}
// Allow for site and per-namespace customization of copyright notice.
wfRunHooks( 'SkinCopyrightFooter', array( $this->getTitle(), $type, &$msg, &$link, &$forContent ) );
+ $msgObj = $this->msg( $msg )->rawParams( $link );
if ( $forContent ) {
- $out .= wfMsgForContent( $msg, $link );
+ $msg = $msgObj->inContentLanguage()->text();
+ if ( $this->getLanguage()->getCode() !== $wgContLang->getCode() ) {
+ $msg = Html::rawElement( 'span', array( 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ), $msg );
+ }
+ return $msg;
} else {
- $out .= wfMsg( $msg, $link );
+ return $msgObj->text();
}
-
- return $out;
}
+ /**
+ * @return null|string
+ */
function getCopyrightIcon() {
global $wgRightsUrl, $wgRightsText, $wgRightsIcon, $wgCopyrightIcon;
global $wgStylePath;
$url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" );
- $text = '<a href="http://www.mediawiki.org/"><img src="' . $url . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
+ $text = '<a href="//www.mediawiki.org/"><img src="' . $url . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
wfRunHooks( 'SkinGetPoweredBy', array( &$text, $this ) );
return $text;
}
/**
* Get the timestamp of the latest revision, formatted in user language
*
- * @param $article Article object. Used if we're working with the current revision
* @return String
*/
- protected function lastModified( $article ) {
- if ( !$this->isRevisionCurrent() ) {
+ protected function lastModified() {
+ $timestamp = $this->getOutput()->getRevisionTimestamp();
+
+ # No cached timestamp, load it from the database
+ if ( $timestamp === null ) {
$timestamp = Revision::getTimestampFromId( $this->getTitle(), $this->getRevisionId() );
- } else {
- $timestamp = $article->getTimestamp();
}
if ( $timestamp ) {
- $d = $this->getContext()->getLang()->date( $timestamp, true );
- $t = $this->getContext()->getLang()->time( $timestamp, true );
- $s = ' ' . wfMsg( 'lastmodifiedat', $d, $t );
+ $d = $this->getLanguage()->userDate( $timestamp, $this->getUser() );
+ $t = $this->getLanguage()->userTime( $timestamp, $this->getUser() );
+ $s = ' ' . $this->msg( 'lastmodifiedat', $d, $t )->text();
} else {
$s = '';
}
if ( wfGetLB()->getLaggedSlaveMode() ) {
- $s .= ' <strong>' . wfMsg( 'laggedslavemode' ) . '</strong>';
+ $s .= ' <strong>' . $this->msg( 'laggedslavemode' )->text() . '</strong>';
}
return $s;
}
+ /**
+ * @param $align string
+ * @return string
+ */
function logoText( $align = '' ) {
if ( $align != '' ) {
$a = " align='{$align}'";
$a = '';
}
- $mp = wfMsg( 'mainpage' );
+ $mp = $this->msg( 'mainpage' )->escaped();
$mptitle = Title::newMainPage();
- $url = ( is_object( $mptitle ) ? $mptitle->escapeLocalURL() : '' );
+ $url = ( is_object( $mptitle ) ? htmlspecialchars( $mptitle->getLocalURL() ) : '' );
$logourl = $this->getLogo();
$s = "<a href='{$url}'><img{$a} src='{$logourl}' alt='[{$mp}]' /></a>";
* @return string
*/
function mainPageLink() {
- $s = Linker::link(
+ $s = Linker::linkKnown(
Title::newMainPage(),
- wfMsg( 'mainpage' ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ $this->msg( 'mainpage' )->escaped()
);
return $s;
}
+ /**
+ * @param $desc
+ * @param $page
+ * @return string
+ */
public function footerLink( $desc, $page ) {
// if the link description has been set to "-" in the default language,
- if ( wfMsgForContent( $desc ) == '-' ) {
+ if ( $this->msg( $desc )->inContentLanguage()->isDisabled() ) {
// then it is disabled, for all languages.
return '';
} else {
// Otherwise, we display the link for the user, described in their
// language (which may or may not be the same as the default language),
// but we make the link target be the one site-wide page.
- $title = Title::newFromText( wfMsgForContent( $page ) );
+ $title = Title::newFromText( $this->msg( $page )->inContentLanguage()->text() );
return Linker::linkKnown(
$title,
- wfMsgExt( $desc, array( 'parsemag', 'escapenoentities' ) )
+ $this->msg( $desc )->escaped()
);
}
}
return $options;
}
+ /**
+ * @param $id User|int
+ * @return bool
+ */
function showEmailUser( $id ) {
- $targetUser = User::newFromId( $id );
- return $this->getContext()->getUser()->canSendEmail() && # the sending user must have a confirmed email address
+ if ( $id instanceof User ) {
+ $targetUser = $id;
+ } else {
+ $targetUser = User::newFromId( $id );
+ }
+ return $this->getUser()->canSendEmail() && # the sending user must have a confirmed email address
$targetUser->canReceiveEmail(); # the target user must have a confirmed email address and allow emails from users
}
}
/* these are used extensively in SkinTemplate, but also some other places */
+
+ /**
+ * @param $urlaction string
+ * @return String
+ */
static function makeMainPageUrl( $urlaction = '' ) {
$title = Title::newMainPage();
self::checkTitle( $title, '' );
return $title->getLocalURL( $urlaction );
}
+ /**
+ * @param $name string
+ * @param $urlaction string
+ * @return String
+ */
static function makeSpecialUrl( $name, $urlaction = '' ) {
$title = SpecialPage::getSafeTitleFor( $name );
return $title->getLocalURL( $urlaction );
}
+ /**
+ * @param $name string
+ * @param $subpage string
+ * @param $urlaction string
+ * @return String
+ */
static function makeSpecialUrlSubpage( $name, $subpage, $urlaction = '' ) {
$title = SpecialPage::getSafeTitleFor( $name, $subpage );
return $title->getLocalURL( $urlaction );
}
+ /**
+ * @param $name string
+ * @param $urlaction string
+ * @return String
+ */
static function makeI18nUrl( $name, $urlaction = '' ) {
$title = Title::newFromText( wfMsgForContent( $name ) );
self::checkTitle( $title, $name );
return $title->getLocalURL( $urlaction );
}
+ /**
+ * @param $name string
+ * @param $urlaction string
+ * @return String
+ */
static function makeUrl( $name, $urlaction = '' ) {
$title = Title::newFromText( $name );
self::checkTitle( $title, $name );
}
}
- # this can be passed the NS number as defined in Language.php
+ /**
+ * this can be passed the NS number as defined in Language.php
+ * @param $name
+ * @param $urlaction string
+ * @param $namespace int
+ * @return String
+ */
static function makeNSUrl( $name, $urlaction = '', $namespace = NS_MAIN ) {
$title = Title::makeTitleSafe( $namespace, $name );
self::checkTitle( $title, $name );
return $title->getLocalURL( $urlaction );
}
- /* these return an array with the 'href' and boolean 'exists' */
+ /**
+ * these return an array with the 'href' and boolean 'exists'
+ * @param $name
+ * @param $urlaction string
+ * @return array
+ */
static function makeUrlDetails( $name, $urlaction = '' ) {
$title = Title::newFromText( $name );
self::checkTitle( $title, $name );
);
}
- # make sure we have some title to operate on
+ /**
+ * make sure we have some title to operate on
+ *
+ * @param $title Title
+ * @param $name string
+ */
static function checkTitle( &$title, $name ) {
if ( !is_object( $title ) ) {
$title = Title::newFromText( $name );
* @return array
*/
function buildSidebar() {
- global $parserMemc, $wgEnableSidebarCache, $wgSidebarCacheExpiry;
+ global $wgMemc, $wgEnableSidebarCache, $wgSidebarCacheExpiry;
wfProfileIn( __METHOD__ );
- $key = wfMemcKey( 'sidebar', $this->getContext()->getLang()->getCode() );
+ $key = wfMemcKey( 'sidebar', $this->getLanguage()->getCode() );
if ( $wgEnableSidebarCache ) {
- $cachedsidebar = $parserMemc->get( $key );
+ $cachedsidebar = $wgMemc->get( $key );
if ( $cachedsidebar ) {
wfProfileOut( __METHOD__ );
return $cachedsidebar;
wfRunHooks( 'SkinBuildSidebar', array( $this, &$bar ) );
if ( $wgEnableSidebarCache ) {
- $parserMemc->set( $key, $bar, $wgSidebarCacheExpiry );
+ $wgMemc->set( $key, $bar, $wgSidebarCacheExpiry );
}
wfProfileOut( __METHOD__ );
*
* This is just a wrapper around addToSidebarPlain() for backwards compatibility
*
- * @param &$bar array
+ * @param $bar array
* @param $message String
*/
function addToSidebar( &$bar, $message ) {
/**
* Add content from plain text
* @since 1.17
- * @param &$bar array
+ * @param $bar array
* @param $text string
* @return Array
*/
function addToSidebarPlain( &$bar, $text ) {
$lines = explode( "\n", $text );
- $wikiBar = array(); # We need to handle the wikitext on a different variable, to avoid trying to do an array operation on text, which would be a fatal error.
$heading = '';
if ( strpos( $line, '*' ) !== 0 ) {
continue;
}
+ $line = rtrim( $line, "\r" ); // for Windows compat
if ( strpos( $line, '**' ) !== 0 ) {
$heading = trim( $line, '* ' );
if ( strpos( $line, '|' ) !== false ) { // sanity check
$line = MessageCache::singleton()->transform( $line, false, null, $this->getTitle() );
$line = array_map( 'trim', explode( '|', $line, 2 ) );
+ if ( count( $line ) !== 2 ) {
+ // Second sanity check, could be hit by people doing
+ // funky stuff with parserfuncs... (bug 33321)
+ continue;
+ }
+
$extraAttribs = array();
- $msgLink = wfMessage( $line[0] )->inContentLanguage();
+ $msgLink = $this->msg( $line[0] )->inContentLanguage();
if ( $msgLink->exists() ) {
$link = $msgLink->text();
if ( $link == '-' ) {
} else {
$link = $line[0];
}
-
- $msgText = wfMessage( $line[1] );
+ $msgText = $this->msg( $line[1] );
if ( $msgText->exists() ) {
$text = $msgText->text();
} else {
if ( preg_match( '/^(?:' . wfUrlProtocols() . ')/', $link ) ) {
$href = $link;
- //Parser::getExternalLinkAttribs won't work here because of the Namespace things
- global $wgNoFollowLinks;
- if ( $wgNoFollowLinks ) {
- $extraAttribs['rel'] = 'nofollow';
- global $wgNoFollowDomainExceptions;
- if ( $wgNoFollowDomainExceptions ) {
- $bits = wfParseUrl( $url );
- if ( is_array( $bits ) && isset( $bits['host'] ) ) {
- foreach ( $wgNoFollowDomainExceptions as $domain ) {
- if ( substr( $bits['host'], -strlen( $domain ) ) == $domain ) {
- unset( $extraAttribs['rel'] );
- break;
- }
- }
- }
- }
+ // Parser::getExternalLinkAttribs won't work here because of the Namespace things
+ global $wgNoFollowLinks, $wgNoFollowDomainExceptions;
+ if ( $wgNoFollowLinks && !wfMatchesDomainList( $href, $wgNoFollowDomainExceptions ) ) {
+ $extraAttribs['rel'] = 'nofollow';
}
+
global $wgExternalLinkTarget;
if ( $wgExternalLinkTarget) {
$extraAttribs['target'] = $wgExternalLinkTarget;
if ( $title ) {
$title = $title->fixSpecialName();
- $href = $title->getLocalURL();
+ $href = $title->getLinkURL();
} else {
$href = 'INVALID-TITLE';
}
$bar[$heading][] = array_merge( array(
'text' => $text,
'href' => $href,
- 'id' => 'n-' . Sanitizer::escapeId( strtr( $line[1], ' ', '-' ) ),
+ 'id' => 'n-' . Sanitizer::escapeId( strtr( $line[1], ' ', '-' ), 'noninitial' ),
'active' => false
), $extraAttribs );
- } elseif ( ( substr( $line, 0, 2 ) == '{{' ) && ( substr( $line, -2 ) == '}}' ) ) {
- global $wgParser;
-
- $line = substr( $line, 2, strlen( $line ) - 4 );
-
- $options = new ParserOptions();
- $options->setEditSection( false );
- $options->setInterfaceMessage( true );
- $wikiBar[$heading] = $wgParser->parse( wfMsgForContentNoTrans( $line ) , $this->getTitle(), $options )->getText();
} else {
continue;
}
}
}
- if ( count( $wikiBar ) > 0 ) {
- $bar = array_merge( $bar, $wikiBar );
- }
-
return $bar;
}
/**
- * Should we include common/wikiprintable.css? Skins that have their own
+ * Should we load mediawiki.legacy.wikiprintable? Skins that have their own
* print stylesheet should override this and return false. (This is an
- * ugly hack to get Monobook to play nicely with
- * OutputPage::headElement().)
+ * ugly hack to get Monobook to play nicely with OutputPage::headElement().)
*
* @return bool
*/
* @return MediaWiki message or if no new talk page messages, nothing
*/
function getNewtalks() {
- $out = $this->getContext()->getOutput();
+ $out = $this->getOutput();
- $newtalks = $this->getContext()->getUser()->getNewMessageLinks();
+ $newtalks = $this->getUser()->getNewMessageLinks();
$ntl = '';
if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) {
$userTalkTitle = $userTitle->getTalkPage();
if ( !$userTalkTitle->equals( $out->getTitle() ) ) {
- $newMessagesLink = $this->link(
+ $newMessagesLink = Linker::linkKnown(
$userTalkTitle,
- wfMsgHtml( 'newmessageslink' ),
+ $this->msg( 'newmessageslink' )->escaped(),
array(),
- array( 'redirect' => 'no' ),
- array( 'known', 'noclasses' )
+ array( 'redirect' => 'no' )
);
- $newMessagesDiffLink = $this->link(
+ $newMessagesDiffLink = Linker::linkKnown(
$userTalkTitle,
- wfMsgHtml( 'newmessagesdifflink' ),
+ $this->msg( 'newmessagesdifflink' )->escaped(),
array(),
- array( 'diff' => 'cur' ),
- array( 'known', 'noclasses' )
+ array( 'diff' => 'cur' )
);
- $ntl = wfMsg(
+ $ntl = $this->msg(
'youhavenewmessages',
$newMessagesLink,
$newMessagesDiffLink
- );
+ )->text();
# Disable Squid cache
$out->setSquidMaxage( 0 );
}
} elseif ( count( $newtalks ) ) {
// _>" " for BC <= 1.16
- $sep = str_replace( '_', ' ', wfMsgHtml( 'newtalkseparator' ) );
+ $sep = str_replace( '_', ' ', $this->msg( 'newtalkseparator' )->escaped() );
$msgs = array();
foreach ( $newtalks as $newtalk ) {
);
}
$parts = implode( $sep, $msgs );
- $ntl = wfMsgHtml( 'youhavenewmessagesmulti', $parts );
+ $ntl = $this->msg( 'youhavenewmessagesmulti' )->rawParams( $parts )->escaped();
$out->setSquidMaxage( 0 );
}
return false;
}
} else {
- $msg = wfMessage( $name )->inContentLanguage();
+ $msg = $this->msg( $name )->inContentLanguage();
if( $msg->isDisabled() ) {
wfProfileOut( __METHOD__ );
return false;
}
if ( $needParse ) {
- $parsed = $this->getContext()->getOutput()->parse( $notice );
+ $parsed = $this->getOutput()->parse( $notice );
$parserMemc->set( $key, array( 'html' => $parsed, 'hash' => md5( $notice ) ), 600 );
$notice = $parsed;
}
$notice = Html::rawElement( 'div', array( 'id' => 'localNotice',
- 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ), $notice );
+ 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ), $notice );
wfProfileOut( __METHOD__ );
return $notice;
}
$siteNotice = '';
if ( wfRunHooks( 'SiteNoticeBefore', array( &$siteNotice, $this ) ) ) {
- if ( is_object( $this->getContext()->getUser() ) && $this->getContext()->getUser()->isLoggedIn() ) {
+ if ( is_object( $this->getUser() ) && $this->getUser()->isLoggedIn() ) {
$siteNotice = $this->getCachedNotice( 'sitenotice' );
} else {
$anonNotice = $this->getCachedNotice( 'anonnotice' );
if ( !is_null( $tooltip ) ) {
# Bug 25462: undo double-escaping.
$tooltip = Sanitizer::decodeCharReferences( $tooltip );
- $attribs['title'] = wfMsgExt( 'editsectionhint', array( 'language' => $lang, 'parsemag' ), $tooltip );
+ $attribs['title'] = wfMsgExt( 'editsectionhint', array( 'language' => $lang, 'parsemag', 'replaceafter' ), $tooltip );
}
$link = Linker::link( $nt, wfMsgExt( 'editsection', array( 'language' => $lang ) ),
$attribs,
# we can rid of it someday.
$attribs = '';
if ( $tooltip ) {
- $attribs = wfMsgExt( 'editsectionhint', array( 'language' => $lang, 'parsemag', 'escape' ), $tooltip );
+ $attribs = wfMsgExt( 'editsectionhint', array( 'language' => $lang, 'parsemag', 'escape', 'replaceafter' ), $tooltip );
$attribs = " title=\"$attribs\"";
}
$result = null;
*
* @param $fname String Name of called method
* @param $args Array Arguments to the method
+ * @return mixed
*/
function __call( $fname, $args ) {
$realFunction = array( 'Linker', $fname );