<?php
+/**
+ * Methods to make links and related items.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
/**
* Some internal bits split of from Skin.php. These functions are used
* for primarily page content: links, embedded images, table of contents. Links
*
* @param $class String: the contents of the class attribute; if an empty
* string is passed, which is the default value, defaults to 'external'.
+ * @return string
* @deprecated since 1.18 Just pass the external class directly to something using Html::expandAttributes
*/
static function getExternalLinkAttributes( $class = 'external' ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
return self::getLinkAttributesInternal( '', $class );
}
* @param $unused String: unused
* @param $class String: the contents of the class attribute; if an empty
* string is passed, which is the default value, defaults to 'external'.
+ * @return string
*/
static function getInterwikiLinkAttributes( $title, $unused = null, $class = 'external' ) {
global $wgContLang;
* not HTML-escaped
* @param $unused String: unused
* @param $class String: the contents of the class attribute, default none
+ * @return string
*/
static function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
$title = urldecode( $title );
* @param $class String: the contents of the class attribute, default none
* @param $title Mixed: optional (unescaped) string to use in the title
* attribute; if false, default to the name of the page we're linking to
+ * @return string
*/
static function getInternalLinkAttributesObj( $nt, $unused = null, $class = '', $title = false ) {
if ( $title === false ) {
* name of the target).
* link() replaces the old functions in the makeLink() family.
*
+ * @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
+ * You can call it using this if you want to keep compat with these:
+ * $linker = class_exists( 'DummyLinker' ) ? new DummyLinker() : new Linker();
+ * $linker->link( ... );
+ *
* @param $target Title Can currently only be a Title, but this may
* change to support Images, literal URLs, etc.
* @param $html string The HTML contents of the <a> element, i.e.,
/**
* Identical to link(), except $options defaults to 'known'.
+ * @return string
*/
public static function linkKnown(
$target, $html = null, $customAttribs = array(),
* Returns the Url used to link to a Title
*
* @param $target Title
+ * @param $query Array: query parameters
+ * @param $options Array
+ * @return String
*/
private static function linkUrl( $target, $query, $options ) {
wfProfileIn( __METHOD__ );
# there's already an action specified, or unless 'edit' makes no sense
# (i.e., for a nonexistent special page).
if ( in_array( 'broken', $options ) && empty( $query['action'] )
- && $target->getNamespace() != NS_SPECIAL ) {
+ && !$target->isSpecialPage() ) {
$query['action'] = 'edit';
$query['redlink'] = '1';
}
- $ret = $target->getLinkUrl( $query );
+ $ret = $target->getLinkURL( $query );
wfProfileOut( __METHOD__ );
return $ret;
}
*/
static function makeSizeLinkObj( $size, $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
global $wgUser;
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.17' );
$threshold = $wgUser->getStubThreshold();
$colour = ( $size < $threshold ) ? 'stub' : '';
return "<strong class=\"selflink\">{$prefix}{$html}{$inside}</strong>{$trail}";
}
+ /**
+ * Get a message saying that an invalid title was encountered.
+ * This should be called after a method like Title::makeTitleSafe() returned
+ * a value indicating that the title object is invalid.
+ *
+ * @param $context IContextSource context to use to get the messages
+ * @param $namespace int Namespace number
+ * @param $title string Text of the title, without the namespace part
+ */
+ public static function getInvalidTitleDescription( IContextSource $context, $namespace, $title ) {
+ global $wgContLang;
+
+ // First we check whether the namespace exists or not.
+ if ( MWNamespace::exists( $namespace ) ) {
+ if ( $namespace == NS_MAIN ) {
+ $name = $context->msg( 'blanknamespace' )->text();
+ } else {
+ $name = $wgContLang->getFormattedNsText( $namespace );
+ }
+ return $context->msg( 'invalidtitle-knownnamespace', $namespace, $name, $title )->text();
+ } else {
+ return $context->msg( 'invalidtitle-unknownnamespace', $namespace, $title )->text();
+ }
+ }
+
/**
* @param $title Title
* @return Title
*/
static function normaliseSpecialPage( Title $title ) {
- if ( $title->getNamespace() == NS_SPECIAL ) {
+ if ( $title->isSpecialPage() ) {
list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
if ( !$name ) {
return $title;
/**
* Get the link parameters for MediaTransformOutput::toHtml() from given
* frame parameters supplied by the Parser.
- * @param $frameParams The frame parameters
- * @param $query An optional query string to add to description page links
+ * @param $frameParams array The frame parameters
+ * @param $query string An optional query string to add to description page links
+ * @return array
*/
private static function getImageLinkMTOParams( $frameParams, $query = '' ) {
$mtoParams = array();
* @param $params Array
* @param $framed Boolean
* @param $manualthumb String
+ * @return mixed
*/
public static function makeThumbLinkObj( Title $title, $file, $label = '', $alt,
$align = 'right', $params = array(), $framed = false , $manualthumb = "" )
* This will make a broken link if $file is false.
*
* @param $title Title object.
- * @param $file File|false mixed File object or false
+ * @param $file File|bool mixed File object or false
* @param $html String: pre-sanitized HTML
* @return String: HTML
*
* @param $escape Boolean: do we escape the link text?
* @param $linktype String: type of external link. Gets added to the classes
* @param $attribs Array of extra attributes to <a>
+ * @return string
*/
public static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array() ) {
$class = "external";
/**
* Make user link (or user contributions for unregistered users)
* @param $userId Integer: user id in database.
- * @param $userText String: user name in database
+ * @param $userName String: user name in database.
+ * @param $altUserName String: text to display instead of the user name (optional)
* @return String: HTML fragment
+ * @since 1.19 Method exists for a long time. $displayText was added in 1.19.
*/
- public static function userLink( $userId, $userText ) {
+ public static function userLink( $userId, $userName, $altUserName = false ) {
if ( $userId == 0 ) {
- $page = SpecialPage::getTitleFor( 'Contributions', $userText );
+ $page = SpecialPage::getTitleFor( 'Contributions', $userName );
} else {
- $page = Title::makeTitle( NS_USER, $userText );
+ $page = Title::makeTitle( NS_USER, $userName );
}
- return self::link( $page, htmlspecialchars( $userText ), array( 'class' => 'mw-userlink' ) );
+
+ return self::link(
+ $page,
+ htmlspecialchars( $altUserName !== false ? $altUserName : $userName ),
+ array( 'class' => 'mw-userlink' )
+ );
}
/**
$items[] = self::emailLink( $userId, $userText );
}
+ wfRunHooks( 'UserToolLinksEdit', array( $userId, $userText, &$items ) );
+
if ( $items ) {
- return ' <span class="mw-usertoollinks">(' . $wgLang->pipeList( $items ) . ')</span>';
+ return ' <span class="mw-usertoollinks">' . wfMessage( 'parentheses' )->rawParams( $wgLang->pipeList( $items ) )->escaped() . '</span>';
} else {
return '';
}
* @param $userId Integer: user identifier
* @param $userText String: user name or IP address
* @param $edits Integer: user edit count (optional, for performance)
+ * @return String
*/
public static function userToolLinksRedContribs( $userId, $userText, $edits = null ) {
return self::userToolLinks( $userId, $userText, true, 0, $edits );
* @param $comment String
* @param $title Mixed: Title object (to generate link to the section in autocomment) or null
* @param $local Boolean: whether section links should refer to local page
+ * @return mixed|String
*/
public static function formatComment( $comment, $title = null, $local = false ) {
wfProfileIn( __METHOD__ );
* Called by Linker::formatComment.
*
* @param $comment String: comment text
- * @param $title An optional title object used to links to sections
+ * @param $title Title|null An optional title object used to links to sections
* @param $local Boolean: whether section links should refer to local page
* @return String: formatted comment
*/
* @return string
*/
private static function formatAutocommentsCallback( $match ) {
+ global $wgLang;
$title = self::$autocommentTitle;
$local = self::$autocommentLocal;
}
if ( $sectionTitle ) {
$link = self::link( $sectionTitle,
- htmlspecialchars( wfMsgForContent( 'sectionlink' ) ), array(), array(),
+ $wgLang->getArrow(), array(), array(),
'noclasses' );
} else {
$link = '';
}
}
- $auto = "$link$auto";
if ( $pre ) {
# written summary $presep autocomment (summary /* section */)
- $auto = wfMsgExt( 'autocomment-prefix', array( 'escapenoentities', 'content' ) ) . $auto;
+ $pre .= wfMsgExt( 'autocomment-prefix', array( 'escapenoentities', 'content' ) );
}
if ( $post ) {
# autocomment $postsep written summary (/* section */ summary)
$auto .= wfMsgExt( 'colon-separator', array( 'escapenoentities', 'content' ) );
}
$auto = '<span class="autocomment">' . $auto . '</span>';
- $comment = $pre . $auto . $post;
+ $comment = $pre . $link . $wgLang->getDirMark() . '<span dir="auto">' . $auto . $post . '</span>';
return $comment;
}
*
* @todo FIXME: Doesn't handle sub-links as in image thumb texts like the main parser
* @param $comment String: text to format links in
- * @param $title An optional title object used to links to sections
+ * @param $title Title|null An optional title object used to links to sections
* @param $local Boolean: whether section links should refer to local page
* @return String
*/
return '';
} else {
$formatted = self::formatComment( $comment, $title, $local );
- return " <span class=\"comment\" dir=\"auto\">($formatted)</span>";
+ $formatted = wfMessage( 'parentheses' )->rawParams( $formatted )->escaped();
+ return " <span class=\"comment\">$formatted</span>";
}
}
} else {
global $wgLang;
$stxt = wfMsgExt( 'nbytes', 'parsemag', $wgLang->formatNum( $size ) );
- $stxt = "($stxt)";
+ $stxt = wfMessage( 'parentheses' )->rawParams( $stxt )->escaped();
}
$stxt = htmlspecialchars( $stxt );
return "<span class=\"history-size\">$stxt</span>";
* End a Table Of Contents line.
* tocUnindent() will be used instead if we're ending a line below
* the new level.
+ * @return string
*/
public static function tocLineEnd() {
return "</li>\n";
* Generate a table of contents from a section tree
* Currently unused.
*
- * @param $tree Return value of ParserOutput::getSections()
+ * @param $tree array Return value of ParserOutput::getSections()
* @return String: HTML fragment
*/
public static function generateTOC( $tree ) {
/**
* Split a link trail, return the "inside" portion and the remainder of the trail
* as a two-element array
+ * @return array
*/
static function splitTrail( $trail ) {
global $wgContLang;
* other users.
*
* @param $rev Revision object
+ * @return string
*/
public static function generateRollback( $rev ) {
return '<span class="mw-rollback-link">['
$query = array(
'action' => 'rollback',
'from' => $rev->getUserText(),
- 'token' => $wgUser->editToken( array( $title->getPrefixedText(), $rev->getUserText() ) ),
+ 'token' => $wgUser->getEditToken( array( $title->getPrefixedText(), $rev->getUserText() ) ),
);
if ( $wgRequest->getBool( 'bot' ) ) {
$query['bot'] = '1';
* Format a size in bytes for output, using an appropriate
* unit (B, KB, MB or GB) according to the magnitude in question
*
- * @param $size Size to format
+ * @param $size int Size to format
* @return String
*/
public static function formatSize( $size ) {
* escape), or false for no title attribute
*/
public static function titleAttrib( $name, $options = null ) {
- global $wgEnableTooltipsAndAccesskeys;
- if ( !$wgEnableTooltipsAndAccesskeys )
- return false;
-
wfProfileIn( __METHOD__ );
$message = wfMessage( "tooltip-$name" );
*/
public static function getRevDeleteLink( User $user, Revision $rev, Title $title ) {
$canHide = $user->isAllowed( 'deleterevision' );
- if ( $canHide || ( $rev->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
- if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
- $revdlink = Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
+ if ( !$canHide && !( $rev->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
+ return '';
+ }
+
+ if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
+ return Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
+ } else {
+ if ( $rev->getId() ) {
+ // RevDelete links using revision ID are stable across
+ // page deletion and undeletion; use when possible.
+ $query = array(
+ 'type' => 'revision',
+ 'target' => $title->getPrefixedDBkey(),
+ 'ids' => $rev->getId()
+ );
} else {
- if ( $rev->getId() ) {
- // RevDelete links using revision ID are stable across
- // page deletion and undeletion; use when possible.
- $query = array(
- 'type' => 'revision',
- 'target' => $title->getPrefixedDBkey(),
- 'ids' => $rev->getId()
- );
- } else {
- // Older deleted entries didn't save a revision ID.
- // We have to refer to these by timestamp, ick!
- $query = array(
- 'type' => 'archive',
- 'target' => $title->getPrefixedDBkey(),
- 'ids' => $rev->getTimestamp()
- );
- }
- return Linker::revDeleteLink( $query,
- $rev->isDeleted( File::DELETED_RESTRICTED ), $canHide );
+ // Older deleted entries didn't save a revision ID.
+ // We have to refer to these by timestamp, ick!
+ $query = array(
+ 'type' => 'archive',
+ 'target' => $title->getPrefixedDBkey(),
+ 'ids' => $rev->getTimestamp()
+ );
}
+ return Linker::revDeleteLink( $query,
+ $rev->isDeleted( Revision::DELETED_RESTRICTED ), $canHide );
}
- return '';
}
/**
$html = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
$tag = $restricted ? 'strong' : 'span';
$link = self::link( $sp, $html, array(), $query, array( 'known', 'noclasses' ) );
- return Xml::tags( $tag, array( 'class' => 'mw-revdelundel-link' ), "($link)" );
+ return Xml::tags( $tag, array( 'class' => 'mw-revdelundel-link' ), wfMessage( 'parentheses' )->rawParams( $link )->escaped() );
}
/**
*/
public static function revDeleteLinkDisabled( $delete = true ) {
$html = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
- return Xml::tags( 'span', array( 'class' => 'mw-revdelundel-link' ), "($html)" );
+ return Xml::tags( 'span', array( 'class' => 'mw-revdelundel-link' ), wfMessage( 'parentheses' )->rawParams( $html )->escaped() );
}
/* Deprecated methods */
* @param $trail String: Optional trail. Alphabetic characters at the start of this string will
* be included in the link text. Other characters will be appended after
* the end of the link.
+ * @return string
*/
static function makeBrokenLink( $title, $text = '', $query = '', $trail = '' ) {
+ wfDeprecated( __METHOD__, '1.16' );
+
$nt = Title::newFromText( $title );
if ( $nt instanceof Title ) {
return self::makeBrokenLinkObj( $nt, $text, $query, $trail );
* be included in the link text. Other characters will be appended after
* the end of the link.
* @param $prefix String: optional prefix. As trail, only before instead of after.
+ * @return string
*/
static function makeLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
+ # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
+
wfProfileIn( __METHOD__ );
$query = wfCgiToArray( $query );
list( $inside, $trail ) = self::splitTrail( $trail );
* @param $prefix String: text before link text
* @param $aprops String: extra attributes to the a-element
* @param $style String: style to apply - if empty, use getInternalLinkAttributesObj instead
- * @return the a-element
+ * @return string the a-element
*/
static function makeKnownLinkObj(
$title, $text = '', $query = '', $trail = '', $prefix = '' , $aprops = '', $style = ''
) {
+ # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
+
wfProfileIn( __METHOD__ );
if ( $text == '' ) {
* be included in the link text. Other characters will be appended after
* the end of the link.
* @param $prefix String: Optional prefix
+ * @return string
*/
static function makeBrokenLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '' ) {
+ wfDeprecated( __METHOD__, '1.16' );
+
wfProfileIn( __METHOD__ );
list( $inside, $trail ) = self::splitTrail( $trail );
* be included in the link text. Other characters will be appended after
* the end of the link.
* @param $prefix String: Optional prefix
+ * @return string
*/
static function makeColouredLinkObj( $nt, $colour, $text = '', $query = '', $trail = '', $prefix = '' ) {
+ wfDeprecated( __METHOD__, '1.16' );
+
if ( $colour != '' ) {
$style = self::getInternalLinkAttributesObj( $nt, $text, $colour );
} else {
/**
* Returns the attributes for the tooltip and access key.
+ * @return array
*/
public static function tooltipAndAccesskeyAttribs( $name ) {
- global $wgEnableTooltipsAndAccesskeys;
- if ( !$wgEnableTooltipsAndAccesskeys )
- return array();
# @todo FIXME: If Sanitizer::expandAttributes() treated "false" as "output
# no attribute" instead of "output '' as value for attribute", this
# would be three lines.
}
/**
- * @deprecated since 1.14
* Returns raw bits of HTML, use titleAttrib()
+ * @return null|string
*/
public static function tooltip( $name, $options = null ) {
- global $wgEnableTooltipsAndAccesskeys;
- if ( !$wgEnableTooltipsAndAccesskeys )
- return '';
# @todo FIXME: If Sanitizer::expandAttributes() treated "false" as "output
# no attribute" instead of "output '' as value for attribute", this
# would be two lines.
*
* @param $fname String Name of called method
* @param $args Array Arguments to the method
+ * @return mixed
*/
public function __call( $fname, $args ) {
return call_user_func_array( array( 'Linker', $fname ), $args );