summaryrefslogtreecommitdiff
path: root/includes/Linker.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/Linker.php')
-rw-r--r--includes/Linker.php991
1 files changed, 467 insertions, 524 deletions
diff --git a/includes/Linker.php b/includes/Linker.php
index 23ece751..be850d02 100644
--- a/includes/Linker.php
+++ b/includes/Linker.php
@@ -25,10 +25,11 @@
* for primarily page content: links, embedded images, table of contents. Links
* are also used in the skin.
*
+ * @todo turn this into a legacy interface for HtmlPageLinkRenderer and similar services.
+ *
* @ingroup Skins
*/
class Linker {
-
/**
* Flags for userToolLinks()
*/
@@ -39,10 +40,11 @@ class Linker {
* Get the appropriate HTML attributes to add to the "a" element of an
* external link, as created by [wikisyntax].
*
- * @param string $class the contents of the class attribute; if an empty
+ * @param string $class 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
+ * @deprecated since 1.18 Just pass the external class directly to something
+ * using Html::expandAttributes.
*/
static function getExternalLinkAttributes( $class = 'external' ) {
wfDeprecated( __METHOD__, '1.18' );
@@ -52,10 +54,10 @@ class Linker {
/**
* Get the appropriate HTML attributes to add to the "a" element of an interwiki link.
*
- * @param string $title the title text for the link, URL-encoded (???) but
+ * @param string $title The title text for the link, URL-encoded (???) but
* not HTML-escaped
- * @param string $unused unused
- * @param string $class the contents of the class attribute; if an empty
+ * @param string $unused Unused
+ * @param string $class The contents of the class attribute; if an empty
* string is passed, which is the default value, defaults to 'external'.
* @return string
*/
@@ -74,10 +76,10 @@ class Linker {
/**
* Get the appropriate HTML attributes to add to the "a" element of an internal link.
*
- * @param string $title the title text for the link, URL-encoded (???) but
+ * @param string $title The title text for the link, URL-encoded (???) but
* not HTML-escaped
- * @param string $unused unused
- * @param string $class the contents of the class attribute, default none
+ * @param string $unused Unused
+ * @param string $class The contents of the class attribute, default none
* @return string
*/
static function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
@@ -90,10 +92,10 @@ class Linker {
* Get the appropriate HTML attributes to add to the "a" element of an internal
* link, given the Title object for the page we want to link to.
*
- * @param $nt Title
- * @param string $unused unused
- * @param string $class the contents of the class attribute, default none
- * @param $title Mixed: optional (unescaped) string to use in the title
+ * @param Title $nt
+ * @param string $unused Unused
+ * @param string $class The contents of the class attribute, default none
+ * @param string|bool $title Optional (unescaped) string to use in the title
* attribute; if false, default to the name of the page we're linking to
* @return string
*/
@@ -107,8 +109,8 @@ class Linker {
/**
* Common code for getLinkAttributesX functions
*
- * @param $title string
- * @param $class string
+ * @param string $title
+ * @param string $class
*
* @return string
*/
@@ -128,9 +130,9 @@ class Linker {
/**
* Return the CSS colour of a known link
*
- * @param $t Title object
- * @param $threshold Integer: user defined threshold
- * @return String: CSS class
+ * @param Title $t
+ * @param int $threshold User defined threshold
+ * @return string CSS class
*/
public static function getLinkColour( $t, $threshold ) {
$colour = '';
@@ -159,25 +161,22 @@ class Linker {
* 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
+ * @param Title $target 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.,
+ * @param string $html The HTML contents of the <a> element, i.e.,
* the link text. This is raw HTML and will not be escaped. If null,
* defaults to the prefixed text of the Title; or if the Title is just a
* fragment, the contents of the fragment.
- * @param array $customAttribs A key => value array of extra HTML attributes,
+ * @param array $customAttribs A key => value array of extra HTML attributes,
* such as title and class. (href is ignored.) Classes will be
* merged with the default classes, while other attributes will replace
* default attributes. All passed attribute values will be HTML-escaped.
* A false attribute value means to suppress that attribute.
- * @param $query array The query string to append to the URL
+ * @param array $query The query string to append to the URL
* you're linking to, in key => value array form. Query keys and values
* will be URL-encoded.
- * @param string|array $options String or array of strings:
+ * @param string|array $options String or array of strings:
* 'known': Page is known to exist, so don't check if it does.
* 'broken': Page is known not to exist, so don't check if it does.
* 'noclasses': Don't add any classes automatically (includes "new",
@@ -193,11 +192,11 @@ class Linker {
public static function link(
$target, $html = null, $customAttribs = array(), $query = array(), $options = array()
) {
- wfProfileIn( __METHOD__ );
if ( !$target instanceof Title ) {
- wfProfileOut( __METHOD__ );
+ wfWarn( __METHOD__ . ': Requires $target to be a Title object.' );
return "<!-- ERROR -->$html";
}
+ wfProfileIn( __METHOD__ );
if ( is_string( $query ) ) {
// some functions withing core using this still hand over query strings
@@ -260,30 +259,31 @@ class Linker {
/**
* Identical to link(), except $options defaults to 'known'.
+ * @see Linker::link
* @return string
*/
public static function linkKnown(
$target, $html = null, $customAttribs = array(),
- $query = array(), $options = array( 'known', 'noclasses' ) )
- {
+ $query = array(), $options = array( 'known', 'noclasses' )
+ ) {
return self::link( $target, $html, $customAttribs, $query, $options );
}
/**
* Returns the Url used to link to a Title
*
- * @param $target Title
- * @param array $query query parameters
- * @param $options Array
- * @return String
+ * @param Title $target
+ * @param array $query Query parameters
+ * @param array $options
+ * @return string
*/
private static function linkUrl( $target, $query, $options ) {
wfProfileIn( __METHOD__ );
# We don't want to include fragments for broken links, because they
# generally make no sense.
- if ( in_array( 'broken', $options ) && $target->mFragment !== '' ) {
+ if ( in_array( 'broken', $options ) && $target->hasFragment() ) {
$target = clone $target;
- $target->mFragment = '';
+ $target->setFragment( '' );
}
# If it's a broken link, add the appropriate query pieces, unless
@@ -311,9 +311,9 @@ class Linker {
/**
* Returns the array of attributes used when linking to the Title $target
*
- * @param $target Title
- * @param $attribs
- * @param $options
+ * @param Title $target
+ * @param array $attribs
+ * @param array $options
*
* @return array
*/
@@ -375,62 +375,44 @@ class Linker {
/**
* Default text of the links to the Title $target
*
- * @param $target Title
+ * @param Title $target
*
* @return string
*/
private static function linkText( $target ) {
- // We might be passed a non-Title by make*LinkObj(). Fail gracefully.
if ( !$target instanceof Title ) {
+ wfWarn( __METHOD__ . ': Requires $target to be a Title object.' );
return '';
}
-
// If the target is just a fragment, with no title, we return the fragment
// text. Otherwise, we return the title text itself.
- if ( $target->getPrefixedText() === '' && $target->getFragment() !== '' ) {
+ if ( $target->getPrefixedText() === '' && $target->hasFragment() ) {
return htmlspecialchars( $target->getFragment() );
}
- return htmlspecialchars( $target->getPrefixedText() );
- }
-
- /**
- * Generate either a normal exists-style link or a stub link, depending
- * on the given page size.
- *
- * @param $size Integer
- * @param $nt Title object.
- * @param $text String
- * @param $query String
- * @param $trail String
- * @param $prefix String
- * @return string HTML of link
- * @deprecated since 1.17
- */
- static function makeSizeLinkObj( $size, $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
- global $wgUser;
- wfDeprecated( __METHOD__, '1.17' );
- $threshold = $wgUser->getStubThreshold();
- $colour = ( $size < $threshold ) ? 'stub' : '';
- // @todo FIXME: Replace deprecated makeColouredLinkObj by link()
- return self::makeColouredLinkObj( $nt, $colour, $text, $query, $trail, $prefix );
+ return htmlspecialchars( $target->getPrefixedText() );
}
/**
- * Make appropriate markup for a link to the current article. This is currently rendered
- * as the bold link text. The calling sequence is the same as the other make*LinkObj static functions,
- * despite $query not being used.
+ * Make appropriate markup for a link to the current article. This is
+ * currently rendered as the bold link text. The calling sequence is the
+ * same as the other make*LinkObj static functions, despite $query not
+ * being used.
*
- * @param $nt Title
+ * @param Title $nt
* @param string $html [optional]
* @param string $query [optional]
* @param string $trail [optional]
* @param string $prefix [optional]
*
- *
* @return string
*/
public static function makeSelfLinkObj( $nt, $html = '', $query = '', $trail = '', $prefix = '' ) {
+ $ret = "<strong class=\"selflink\">{$prefix}{$html}</strong>{$trail}";
+ if ( !wfRunHooks( 'SelfLinkBegin', array( $nt, &$html, &$trail, &$prefix, &$ret ) ) ) {
+ return $ret;
+ }
+
if ( $html == '' ) {
$html = htmlspecialchars( $nt->getPrefixedText() );
}
@@ -443,7 +425,7 @@ class Linker {
* 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 IContextSource $context Context to use to get the messages
* @param int $namespace Namespace number
* @param string $title Text of the title, without the namespace part
* @return string
@@ -465,7 +447,7 @@ class Linker {
}
/**
- * @param $title Title
+ * @param Title $title
* @return Title
*/
static function normaliseSpecialPage( Title $title ) {
@@ -474,8 +456,7 @@ class Linker {
if ( !$name ) {
return $title;
}
- $ret = SpecialPage::getTitleFor( $name, $subpage );
- $ret->mFragment = $title->getFragment();
+ $ret = SpecialPage::getTitleFor( $name, $subpage, $title->getFragment() );
return $ret;
} else {
return $title;
@@ -486,7 +467,7 @@ class Linker {
* Returns the filename part of an url.
* Used as alternative text for external images.
*
- * @param $url string
+ * @param string $url
*
* @return string
*/
@@ -504,8 +485,8 @@ class Linker {
* Return the code for images which were added via external links,
* via Parser::maybeMakeExternalImage().
*
- * @param $url
- * @param $alt
+ * @param string $url
+ * @param string $alt
*
* @return string
*/
@@ -516,7 +497,8 @@ class Linker {
$img = '';
$success = wfRunHooks( 'LinkerMakeExternalImage', array( &$url, &$alt, &$img ) );
if ( !$success ) {
- wfDebug( "Hook LinkerMakeExternalImage changed the output of external image with url {$url} and alt text {$alt} to {$img}\n", true );
+ wfDebug( "Hook LinkerMakeExternalImage changed the output of external image "
+ . "with url {$url} and alt text {$alt} to {$img}\n", true );
return $img;
}
return Html::element( 'img',
@@ -529,10 +511,10 @@ class Linker {
* Given parameters derived from [[Image:Foo|options...]], generate the
* HTML that that syntax inserts in the page.
*
- * @param $parser Parser object
- * @param $title Title object of the file (not the currently viewed page)
- * @param $file File object, or false if it doesn't exist
- * @param array $frameParams associative array of parameters external to the media handler.
+ * @param Parser $parser
+ * @param Title $title Title object of the file (not the currently viewed page)
+ * @param File $file File object, or false if it doesn't exist
+ * @param array $frameParams Associative array of parameters external to the media handler.
* Boolean parameters are indicated by presence or absence, the value is arbitrary and
* will often be false.
* thumbnail If present, downscale and frame
@@ -553,17 +535,18 @@ class Linker {
* link-target Value for the target attribute, only with link-url
* no-link Boolean, suppress description link
*
- * @param array $handlerParams associative array of media handler parameters, to be passed
+ * @param array $handlerParams Associative array of media handler parameters, to be passed
* to transform(). Typical keys are "width" and "page".
- * @param string $time timestamp of the file, set as false for current
- * @param string $query query params for desc url
- * @param $widthOption: Used by the parser to remember the user preference thumbnailsize
+ * @param string|bool $time Timestamp of the file, set as false for current
+ * @param string $query Query params for desc url
+ * @param int|null $widthOption Used by the parser to remember the user preference thumbnailsize
* @since 1.20
- * @return String: HTML for an image, with links, wrappers, etc.
+ * @return string HTML for an image, with links, wrappers, etc.
*/
- public static function makeImageLink( /*Parser*/ $parser, Title $title, $file, $frameParams = array(),
- $handlerParams = array(), $time = false, $query = "", $widthOption = null )
- {
+ public static function makeImageLink( Parser $parser, Title $title,
+ $file, $frameParams = array(), $handlerParams = array(), $time = false,
+ $query = "", $widthOption = null
+ ) {
$res = null;
$dummy = new DummyLinker;
if ( !wfRunHooks( 'ImageBeforeProduceHTML', array( &$dummy, &$title,
@@ -612,8 +595,14 @@ class Linker {
$hp['width'] = $file->getWidth( $page );
}
- if ( isset( $fp['thumbnail'] ) || isset( $fp['manualthumb'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
+ if ( isset( $fp['thumbnail'] )
+ || isset( $fp['manualthumb'] )
+ || isset( $fp['framed'] )
+ || isset( $fp['frameless'] )
+ || !$hp['width']
+ ) {
global $wgThumbLimits, $wgThumbUpright;
+
if ( $widthOption === null || !isset( $wgThumbLimits[$widthOption] ) ) {
$widthOption = User::getDefaultOption( 'thumbsize' );
}
@@ -622,7 +611,10 @@ class Linker {
if ( isset( $fp['upright'] ) && $fp['upright'] == 0 ) {
$fp['upright'] = $wgThumbUpright;
}
- // For caching health: If width scaled down due to upright parameter, round to full __0 pixel to avoid the creation of a lot of odd thumbs
+
+ // For caching health: If width scaled down due to upright
+ // parameter, round to full __0 pixel to avoid the creation of a
+ // lot of odd thumbs.
$prefWidth = isset( $fp['upright'] ) ?
round( $wgThumbLimits[$widthOption] * $fp['upright'], -1 ) :
$wgThumbLimits[$widthOption];
@@ -644,21 +636,16 @@ class Linker {
# If a thumbnail width has not been provided, it is set
# to the default user option as specified in Language*.php
if ( $fp['align'] == '' ) {
- if ( $parser instanceof Parser ) {
- $fp['align'] = $parser->getTargetLanguage()->alignEnd();
- } else {
- # backwards compatibility, remove with makeImageLink2()
- global $wgContLang;
- $fp['align'] = $wgContLang->alignEnd();
- }
+ $fp['align'] = $parser->getTargetLanguage()->alignEnd();
}
return $prefix . self::makeThumbLink2( $title, $file, $fp, $hp, $time, $query ) . $postfix;
}
if ( $file && isset( $fp['frameless'] ) ) {
$srcWidth = $file->getWidth( $page );
- # For "frameless" option: do not present an image bigger than the source (for bitmap-style images)
- # This is the same behavior as the "thumb" option does it already.
+ # For "frameless" option: do not present an image bigger than the
+ # source (for bitmap-style images). This is the same behavior as the
+ # "thumb" option does it already.
if ( $srcWidth && !$file->mustRender() && $hp['width'] > $srcWidth ) {
$hp['width'] = $srcWidth;
}
@@ -681,8 +668,7 @@ class Linker {
'valign' => isset( $fp['valign'] ) ? $fp['valign'] : false,
'img-class' => $fp['class'] );
if ( isset( $fp['border'] ) ) {
- // TODO: BUG? Both values are identical
- $params['img-class'] .= ( $params['img-class'] !== '' ) ? ' thumbborder' : 'thumbborder';
+ $params['img-class'] .= ( $params['img-class'] !== '' ? ' ' : '' ) . 'thumbborder';
}
$params = self::getImageLinkMTOParams( $fp, $query, $parser ) + $params;
@@ -710,6 +696,7 @@ class Linker {
* frame parameters supplied by the Parser.
* @param array $frameParams The frame parameters
* @param string $query An optional query string to add to description page links
+ * @param Parser|null $parser
* @return array
*/
private static function getImageLinkMTOParams( $frameParams, $query = '', $parser = null ) {
@@ -739,19 +726,19 @@ class Linker {
/**
* Make HTML for a thumbnail including image, border and caption
- * @param $title Title object
- * @param $file File object or false if it doesn't exist
- * @param $label String
- * @param $alt String
- * @param $align String
- * @param $params Array
- * @param $framed Boolean
- * @param $manualthumb String
- * @return mixed
+ * @param Title $title
+ * @param File|bool $file File object or false if it doesn't exist
+ * @param string $label
+ * @param string $alt
+ * @param string $align
+ * @param array $params
+ * @param bool $framed
+ * @param string $manualthumb
+ * @return string
*/
public static function makeThumbLinkObj( Title $title, $file, $label = '', $alt,
- $align = 'right', $params = array(), $framed = false, $manualthumb = "" )
- {
+ $align = 'right', $params = array(), $framed = false, $manualthumb = ""
+ ) {
$frameParams = array(
'alt' => $alt,
'caption' => $label,
@@ -767,18 +754,17 @@ class Linker {
}
/**
- * @param $title Title
- * @param $file File
+ * @param Title $title
+ * @param File $file
* @param array $frameParams
* @param array $handlerParams
* @param bool $time
* @param string $query
- * @return mixed
+ * @return string
*/
public static function makeThumbLink2( Title $title, $file, $frameParams = array(),
- $handlerParams = array(), $time = false, $query = "" )
- {
- global $wgStylePath, $wgContLang;
+ $handlerParams = array(), $time = false, $query = ""
+ ) {
$exists = $file && $file->exists();
# Shortcuts
@@ -850,14 +836,16 @@ class Linker {
if ( $page ) {
$url = wfAppendQuery( $url, array( 'page' => $page ) );
}
- if ( $manualthumb &&
- !isset( $fp['link-title'] ) &&
- !isset( $fp['link-url'] ) &&
- !isset( $fp['no-link'] ) ) {
+ if ( $manualthumb
+ && !isset( $fp['link-title'] )
+ && !isset( $fp['link-url'] )
+ && !isset( $fp['no-link'] ) ) {
$fp['link-url'] = $url;
}
- $s = "<div class=\"thumb t{$fp['align']}\"><div class=\"thumbinner\" style=\"width:{$outerWidth}px;\">";
+ $s = "<div class=\"thumb t{$fp['align']}\">"
+ . "<div class=\"thumbinner\" style=\"width:{$outerWidth}px;\">";
+
if ( !$exists ) {
$s .= self::makeBrokenImageLinkObj( $title, $fp['title'], '', '', '', $time == true );
$zoomIcon = '';
@@ -871,7 +859,9 @@ class Linker {
$params = array(
'alt' => $fp['alt'],
'title' => $fp['title'],
- 'img-class' => ( isset( $fp['class'] ) && $fp['class'] !== '' ) ? $fp['class'] . ' thumbimage' : 'thumbimage'
+ 'img-class' => ( isset( $fp['class'] ) && $fp['class'] !== ''
+ ? $fp['class'] . ' '
+ : '' ) . 'thumbimage'
);
$params = self::getImageLinkMTOParams( $fp, $query ) + $params;
$s .= $thumb->toHtml( $params );
@@ -883,11 +873,7 @@ class Linker {
'href' => $url,
'class' => 'internal',
'title' => wfMessage( 'thumbnail-more' )->text() ),
- Html::element( 'img', array(
- 'src' => $wgStylePath . '/common/images/magnify-clip' . ( $wgContLang->isRTL() ? '-rtl' : '' ) . '.png',
- 'width' => 15,
- 'height' => 11,
- 'alt' => "" ) ) ) );
+ "" ) );
}
}
$s .= ' <div class="thumbcaption">' . $zoomIcon . $fp['caption'] . "</div></div></div>";
@@ -899,12 +885,12 @@ class Linker {
* applicable.
*
* @param File $file
- * @param MediaOutput $thumb
- * @param array $hp image parameters
+ * @param MediaTransformOutput $thumb
+ * @param array $hp Image parameters
*/
- protected static function processResponsiveImages( $file, $thumb, $hp ) {
+ public static function processResponsiveImages( $file, $thumb, $hp ) {
global $wgResponsiveImages;
- if ( $wgResponsiveImages ) {
+ if ( $wgResponsiveImages && $thumb && !$thumb->isError() ) {
$hp15 = $hp;
$hp15['width'] = round( $hp['width'] * 1.5 );
$hp20 = $hp;
@@ -916,11 +902,11 @@ class Linker {
$thumb15 = $file->transform( $hp15 );
$thumb20 = $file->transform( $hp20 );
- if ( $thumb15->url !== $thumb->url ) {
- $thumb->responsiveUrls['1.5'] = $thumb15->url;
+ if ( $thumb15 && !$thumb15->isError() && $thumb15->getUrl() !== $thumb->getUrl() ) {
+ $thumb->responsiveUrls['1.5'] = $thumb15->getUrl();
}
- if ( $thumb20->url !== $thumb->url ) {
- $thumb->responsiveUrls['2'] = $thumb20->url;
+ if ( $thumb20 && !$thumb20->isError() && $thumb20->getUrl() !== $thumb->getUrl() ) {
+ $thumb->responsiveUrls['2'] = $thumb20->getUrl();
}
}
}
@@ -928,19 +914,23 @@ class Linker {
/**
* Make a "broken" link to an image
*
- * @param $title Title object
- * @param string $label link label (plain text)
- * @param string $query query string
- * @param $unused1 Unused parameter kept for b/c
- * @param $unused2 Unused parameter kept for b/c
- * @param $time Boolean: a file of a certain timestamp was requested
- * @return String
+ * @param Title $title
+ * @param string $label Link label (plain text)
+ * @param string $query Query string
+ * @param string $unused1 Unused parameter kept for b/c
+ * @param string $unused2 Unused parameter kept for b/c
+ * @param bool $time A file of a certain timestamp was requested
+ * @return string
*/
- public static function makeBrokenImageLinkObj( $title, $label = '', $query = '', $unused1 = '', $unused2 = '', $time = false ) {
- global $wgEnableUploads, $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
- if ( ! $title instanceof Title ) {
+ public static function makeBrokenImageLinkObj( $title, $label = '',
+ $query = '', $unused1 = '', $unused2 = '', $time = false
+ ) {
+ if ( !$title instanceof Title ) {
+ wfWarn( __METHOD__ . ': Requires $title to be a Title object.' );
return "<!-- ERROR -->" . htmlspecialchars( $label );
}
+
+ global $wgEnableUploads, $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
wfProfileIn( __METHOD__ );
if ( $label == '' ) {
$label = $title->getPrefixedText();
@@ -948,7 +938,9 @@ class Linker {
$encLabel = htmlspecialchars( $label );
$currentExists = $time ? ( wfFindFile( $title ) != false ) : false;
- if ( ( $wgUploadMissingFileUrl || $wgUploadNavigationUrl || $wgEnableUploads ) && !$currentExists ) {
+ if ( ( $wgUploadMissingFileUrl || $wgUploadNavigationUrl || $wgEnableUploads )
+ && !$currentExists
+ ) {
$redir = RepoGroup::singleton()->getLocalRepo()->checkRedirect( $title );
if ( $redir ) {
@@ -971,9 +963,9 @@ class Linker {
/**
* Get the URL to upload a certain file
*
- * @param $destFile Title object of the file to upload
- * @param string $query urlencoded query string to prepend
- * @return String: urlencoded URL
+ * @param Title $destFile Title object of the file to upload
+ * @param string $query Urlencoded query string to prepend
+ * @return string Urlencoded URL
*/
protected static function getUploadUrl( $destFile, $query = '' ) {
global $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
@@ -995,10 +987,10 @@ class Linker {
/**
* Create a direct link to a given uploaded file.
*
- * @param $title Title object.
- * @param string $html pre-sanitized HTML
+ * @param Title $title
+ * @param string $html Pre-sanitized HTML
* @param string $time MW timestamp of file creation time
- * @return String: HTML
+ * @return string HTML
*/
public static function makeMediaLinkObj( $title, $html = '', $time = false ) {
$img = wfFindFile( $title, array( 'time' => $time ) );
@@ -1009,10 +1001,10 @@ class Linker {
* Create a direct link to a given uploaded file.
* This will make a broken link if $file is false.
*
- * @param $title Title object.
- * @param $file File|bool mixed File object or false
- * @param string $html pre-sanitized HTML
- * @return String: HTML
+ * @param Title $title
+ * @param File|bool $file File object or false
+ * @param string $html Pre-sanitized HTML
+ * @return string HTML
*
* @todo Handle invalid or missing images better.
*/
@@ -1024,12 +1016,27 @@ class Linker {
$url = self::getUploadUrl( $title );
$class = 'new';
}
- $alt = htmlspecialchars( $title->getText(), ENT_QUOTES );
+
+ $alt = $title->getText();
if ( $html == '' ) {
$html = $alt;
}
- $u = htmlspecialchars( $url );
- return "<a href=\"{$u}\" class=\"$class\" title=\"{$alt}\">{$html}</a>";
+
+ $ret = '';
+ $attribs = array(
+ 'href' => $url,
+ 'class' => $class,
+ 'title' => $alt
+ );
+
+ if ( !wfRunHooks( 'LinkerMakeMediaLinkFile',
+ array( $title, $file, &$html, &$attribs, &$ret ) ) ) {
+ wfDebug( "Hook LinkerMakeMediaLinkFile changed the output of link "
+ . "with url {$url} and text {$html} to {$ret}\n", true );
+ return $ret;
+ }
+
+ return Html::rawElement( 'a', $attribs, $html );
}
/**
@@ -1037,6 +1044,8 @@ class Linker {
* a message key from the link text.
* Usage example: Linker::specialLink( 'Recentchanges' )
*
+ * @param string $name
+ * @param string $key
* @return string
*/
public static function specialLink( $name, $key = '' ) {
@@ -1050,14 +1059,16 @@ class Linker {
/**
* Make an external link
* @param string $url URL to link to
- * @param string $text text of link
- * @param $escape Boolean: do we escape the link text?
- * @param string $linktype type of external link. Gets added to the classes
- * @param array $attribs of extra attributes to <a>
- * @param $title Title|null Title object used for title specific link attributes
+ * @param string $text Text of link
+ * @param bool $escape Do we escape the link text?
+ * @param string $linktype Type of external link. Gets added to the classes
+ * @param array $attribs Array of extra attributes to <a>
+ * @param Title|null $title Title object used for title specific link attributes
* @return string
*/
- public static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array(), $title = null ) {
+ public static function makeExternalLink( $url, $text, $escape = true,
+ $linktype = '', $attribs = array(), $title = null
+ ) {
global $wgTitle;
$class = "external";
if ( $linktype ) {
@@ -1080,7 +1091,8 @@ class Linker {
$success = wfRunHooks( 'LinkerMakeExternalLink',
array( &$url, &$text, &$link, &$attribs, $linktype ) );
if ( !$success ) {
- wfDebug( "Hook LinkerMakeExternalLink changed the output of link with url {$url} and text {$text} to {$link}\n", true );
+ wfDebug( "Hook LinkerMakeExternalLink changed the output of link "
+ . "with url {$url} and text {$text} to {$link}\n", true );
return $link;
}
$attribs['href'] = $url;
@@ -1089,18 +1101,20 @@ class Linker {
/**
* Make user link (or user contributions for unregistered users)
- * @param $userId Integer: user id in database.
- * @param string $userName user name in database.
- * @param string $altUserName text to display instead of the user name (optional)
- * @return String: HTML fragment
+ * @param int $userId User id in database.
+ * @param string $userName User name in database.
+ * @param string $altUserName Text to display instead of the user name (optional)
+ * @return string HTML fragment
* @since 1.19 Method exists for a long time. $altUserName was added in 1.19.
*/
public static function userLink( $userId, $userName, $altUserName = false ) {
+ $classes = 'mw-userlink';
if ( $userId == 0 ) {
$page = SpecialPage::getTitleFor( 'Contributions', $userName );
if ( $altUserName === false ) {
$altUserName = IP::prettifyIP( $userName );
}
+ $classes .= ' mw-anonuserlink'; // Separate link class for anons (bug 43179)
} else {
$page = Title::makeTitle( NS_USER, $userName );
}
@@ -1108,20 +1122,21 @@ class Linker {
return self::link(
$page,
htmlspecialchars( $altUserName !== false ? $altUserName : $userName ),
- array( 'class' => 'mw-userlink' )
+ array( 'class' => $classes )
);
}
/**
* Generate standard user tool links (talk, contributions, block link, etc.)
*
- * @param $userId Integer: user identifier
- * @param string $userText user name or IP address
- * @param $redContribsWhenNoEdits Boolean: should the contributions link be
- * red if the user has no edits?
- * @param $flags Integer: customisation flags (e.g. Linker::TOOL_LINKS_NOBLOCK and Linker::TOOL_LINKS_EMAIL)
- * @param $edits Integer: user edit count (optional, for performance)
- * @return String: HTML fragment
+ * @param int $userId User identifier
+ * @param string $userText User name or IP address
+ * @param bool $redContribsWhenNoEdits Should the contributions link be
+ * red if the user has no edits?
+ * @param int $flags Customisation flags (e.g. Linker::TOOL_LINKS_NOBLOCK
+ * and Linker::TOOL_LINKS_EMAIL).
+ * @param int $edits User edit count (optional, for performance)
+ * @return string HTML fragment
*/
public static function userToolLinks(
$userId, $userText, $redContribsWhenNoEdits = false, $flags = 0, $edits = null
@@ -1173,19 +1188,19 @@ class Linker {
/**
* Alias for userToolLinks( $userId, $userText, true );
- * @param $userId Integer: user identifier
- * @param string $userText user name or IP address
- * @param $edits Integer: user edit count (optional, for performance)
- * @return String
+ * @param int $userId User identifier
+ * @param string $userText User name or IP address
+ * @param int $edits 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 $userId Integer: user id in database.
- * @param string $userText user name in database.
- * @return String: HTML fragment with user talk link
+ * @param int $userId User id in database.
+ * @param string $userText User name in database.
+ * @return string HTML fragment with user talk link
*/
public static function userTalkLink( $userId, $userText ) {
$userTalkPage = Title::makeTitle( NS_USER_TALK, $userText );
@@ -1194,9 +1209,9 @@ class Linker {
}
/**
- * @param $userId Integer: userid
- * @param string $userText user name in database.
- * @return String: HTML fragment with block link
+ * @param int $userId Userid
+ * @param string $userText User name in database.
+ * @return string HTML fragment with block link
*/
public static function blockLink( $userId, $userText ) {
$blockPage = SpecialPage::getTitleFor( 'Block', $userText );
@@ -1205,9 +1220,9 @@ class Linker {
}
/**
- * @param $userId Integer: userid
- * @param string $userText user name in database.
- * @return String: HTML fragment with e-mail user link
+ * @param int $userId Userid
+ * @param string $userText User name in database.
+ * @return string HTML fragment with e-mail user link
*/
public static function emailLink( $userId, $userText ) {
$emailPage = SpecialPage::getTitleFor( 'Emailuser', $userText );
@@ -1217,9 +1232,9 @@ class Linker {
/**
* Generate a user link if the current user is allowed to view it
- * @param $rev Revision object.
- * @param $isPublic Boolean: show only if all users can see it
- * @return String: HTML fragment
+ * @param Revision $rev
+ * @param bool $isPublic Show only if all users can see it
+ * @return string HTML fragment
*/
public static function revUserLink( $rev, $isPublic = false ) {
if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
@@ -1238,8 +1253,8 @@ class Linker {
/**
* Generate a user tool link cluster if the current user is allowed to view it
- * @param $rev Revision object.
- * @param $isPublic Boolean: show only if all users can see it
+ * @param Revision $rev
+ * @param bool $isPublic Show only if all users can see it
* @return string HTML
*/
public static function revUserTools( $rev, $isPublic = false ) {
@@ -1272,10 +1287,10 @@ class Linker {
* Since you can't set a default parameter for a reference, I've turned it
* temporarily to a value pass. Should be adjusted further. --brion
*
- * @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
+ * @param string $comment
+ * @param Title|null $title Title object (to generate link to the section in autocomment) or null
+ * @param bool $local Whether section links should refer to local page
+ * @return mixed|string
*/
public static function formatComment( $comment, $title = null, $local = false ) {
wfProfileIn( __METHOD__ );
@@ -1294,12 +1309,6 @@ class Linker {
}
/**
- * @var Title
- */
- static $autocommentTitle;
- static $autocommentLocal;
-
- /**
* Converts autogenerated comments in edit summaries into section links.
* The pattern for autogen comments is / * foo * /, which makes for
* some nasty regex.
@@ -1307,99 +1316,77 @@ class Linker {
* add a separator where needed and format the comment itself with CSS
* Called by Linker::formatComment.
*
- * @param string $comment comment text
- * @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
+ * @param string $comment Comment text
+ * @param Title|null $title An optional title object used to links to sections
+ * @param bool $local Whether section links should refer to local page
+ * @return string Formatted comment
*/
private static function formatAutocomments( $comment, $title = null, $local = false ) {
- // Bah!
- self::$autocommentTitle = $title;
- self::$autocommentLocal = $local;
- $comment = preg_replace_callback(
+ return preg_replace_callback(
'!(.*)/\*\s*(.*?)\s*\*/(.*)!',
- array( 'Linker', 'formatAutocommentsCallback' ),
- $comment );
- self::$autocommentTitle = null;
- self::$autocommentLocal = null;
- return $comment;
- }
-
- /**
- * Helper function for Linker::formatAutocomments
- * @param $match
- * @return string
- */
- private static function formatAutocommentsCallback( $match ) {
- global $wgLang;
- $title = self::$autocommentTitle;
- $local = self::$autocommentLocal;
-
- $pre = $match[1];
- $auto = $match[2];
- $post = $match[3];
- $comment = null;
- wfRunHooks( 'FormatAutocomments', array( &$comment, $pre, $auto, $post, $title, $local ) );
- if ( $comment === null ) {
- $link = '';
- if ( $title ) {
- $section = $auto;
-
- # Remove links that a user may have manually put in the autosummary
- # This could be improved by copying as much of Parser::stripSectionName as desired.
- $section = str_replace( '[[:', '', $section );
- $section = str_replace( '[[', '', $section );
- $section = str_replace( ']]', '', $section );
-
- $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # bug 22784
- if ( $local ) {
- $sectionTitle = Title::newFromText( '#' . $section );
- } else {
- $sectionTitle = Title::makeTitleSafe( $title->getNamespace(),
- $title->getDBkey(), $section );
- }
- if ( $sectionTitle ) {
- $link = self::link( $sectionTitle,
- $wgLang->getArrow(), array(), array(),
- 'noclasses' );
- } else {
+ function ( $match ) use ( $title, $local ) {
+ global $wgLang;
+
+ $pre = $match[1];
+ $auto = $match[2];
+ $post = $match[3];
+ $comment = null;
+ wfRunHooks( 'FormatAutocomments', array( &$comment, $pre, $auto, $post, $title, $local ) );
+ if ( $comment === null ) {
$link = '';
+ if ( $title ) {
+ $section = $auto;
+ # Remove links that a user may have manually put in the autosummary
+ # This could be improved by copying as much of Parser::stripSectionName as desired.
+ $section = str_replace( '[[:', '', $section );
+ $section = str_replace( '[[', '', $section );
+ $section = str_replace( ']]', '', $section );
+
+ $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # bug 22784
+ if ( $local ) {
+ $sectionTitle = Title::newFromText( '#' . $section );
+ } else {
+ $sectionTitle = Title::makeTitleSafe( $title->getNamespace(),
+ $title->getDBkey(), $section );
+ }
+ if ( $sectionTitle ) {
+ $link = Linker::link( $sectionTitle,
+ $wgLang->getArrow(), array(), array(),
+ 'noclasses' );
+ } else {
+ $link = '';
+ }
+ }
+ if ( $pre ) {
+ # written summary $presep autocomment (summary /* section */)
+ $pre .= wfMessage( 'autocomment-prefix' )->inContentLanguage()->escaped();
+ }
+ if ( $post ) {
+ # autocomment $postsep written summary (/* section */ summary)
+ $auto .= wfMessage( 'colon-separator' )->inContentLanguage()->escaped();
+ }
+ $auto = '<span class="autocomment">' . $auto . '</span>';
+ $comment = $pre . $link . $wgLang->getDirMark()
+ . '<span dir="auto">' . $auto . $post . '</span>';
}
- }
- if ( $pre ) {
- # written summary $presep autocomment (summary /* section */)
- $pre .= wfMessage( 'autocomment-prefix' )->inContentLanguage()->escaped();
- }
- if ( $post ) {
- # autocomment $postsep written summary (/* section */ summary)
- $auto .= wfMessage( 'colon-separator' )->inContentLanguage()->escaped();
- }
- $auto = '<span class="autocomment">' . $auto . '</span>';
- $comment = $pre . $link . $wgLang->getDirMark() . '<span dir="auto">' . $auto . $post . '</span>';
- }
- return $comment;
+ return $comment;
+ },
+ $comment
+ );
}
/**
- * @var Title
- */
- static $commentContextTitle;
- static $commentLocal;
-
- /**
* Formats wiki links and media links in text; all other wiki formatting
* is ignored
*
* @todo FIXME: Doesn't handle sub-links as in image thumb texts like the main parser
- * @param string $comment text to format links in
- * @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
+ * @param string $comment Text to format links in
+ * @param Title|null $title An optional title object used to links to sections
+ * @param bool $local Whether section links should refer to local page
+ * @return string
*/
public static function formatLinksInComment( $comment, $title = null, $local = false ) {
- self::$commentContextTitle = $title;
- self::$commentLocal = $local;
- $html = preg_replace_callback(
+ return preg_replace_callback(
'/
\[\[
:? # ignore optional leading colon
@@ -1412,89 +1399,89 @@ class Linker {
\]\]
([^[]*) # 3. link trail (the text up until the next link)
/x',
- array( 'Linker', 'formatLinksInCommentCallback' ),
- $comment );
- self::$commentContextTitle = null;
- self::$commentLocal = null;
- return $html;
- }
-
- /**
- * @param $match
- * @return mixed
- */
- protected static function formatLinksInCommentCallback( $match ) {
- global $wgContLang;
+ function ( $match ) use ( $title, $local ) {
+ global $wgContLang;
- $medians = '(?:' . preg_quote( MWNamespace::getCanonicalName( NS_MEDIA ), '/' ) . '|';
- $medians .= preg_quote( $wgContLang->getNsText( NS_MEDIA ), '/' ) . '):';
+ $medians = '(?:' . preg_quote( MWNamespace::getCanonicalName( NS_MEDIA ), '/' ) . '|';
+ $medians .= preg_quote( $wgContLang->getNsText( NS_MEDIA ), '/' ) . '):';
- $comment = $match[0];
+ $comment = $match[0];
- # fix up urlencoded title texts (copied from Parser::replaceInternalLinks)
- if ( strpos( $match[1], '%' ) !== false ) {
- $match[1] = str_replace( array( '<', '>' ), array( '&lt;', '&gt;' ), rawurldecode( $match[1] ) );
- }
+ # fix up urlencoded title texts (copied from Parser::replaceInternalLinks)
+ if ( strpos( $match[1], '%' ) !== false ) {
+ $match[1] = str_replace(
+ array( '<', '>' ),
+ array( '&lt;', '&gt;' ),
+ rawurldecode( $match[1] )
+ );
+ }
- # Handle link renaming [[foo|text]] will show link as "text"
- if ( $match[2] != "" ) {
- $text = $match[2];
- } else {
- $text = $match[1];
- }
- $submatch = array();
- $thelink = null;
- if ( preg_match( '/^' . $medians . '(.*)$/i', $match[1], $submatch ) ) {
- # Media link; trail not supported.
- $linkRegexp = '/\[\[(.*?)\]\]/';
- $title = Title::makeTitleSafe( NS_FILE, $submatch[1] );
- if ( $title ) {
- $thelink = self::makeMediaLinkObj( $title, $text );
- }
- } else {
- # Other kind of link
- if ( preg_match( $wgContLang->linkTrail(), $match[3], $submatch ) ) {
- $trail = $submatch[1];
- } else {
- $trail = "";
- }
- $linkRegexp = '/\[\[(.*?)\]\]' . preg_quote( $trail, '/' ) . '/';
- if ( isset( $match[1][0] ) && $match[1][0] == ':' ) {
- $match[1] = substr( $match[1], 1 );
- }
- list( $inside, $trail ) = self::splitTrail( $trail );
-
- $linkText = $text;
- $linkTarget = self::normalizeSubpageLink( self::$commentContextTitle,
- $match[1], $linkText );
-
- $target = Title::newFromText( $linkTarget );
- if ( $target ) {
- if ( $target->getText() == '' && $target->getInterwiki() === ''
- && !self::$commentLocal && self::$commentContextTitle )
- {
- $newTarget = clone ( self::$commentContextTitle );
- $newTarget->setFragment( '#' . $target->getFragment() );
- $target = $newTarget;
+ # Handle link renaming [[foo|text]] will show link as "text"
+ if ( $match[2] != "" ) {
+ $text = $match[2];
+ } else {
+ $text = $match[1];
+ }
+ $submatch = array();
+ $thelink = null;
+ if ( preg_match( '/^' . $medians . '(.*)$/i', $match[1], $submatch ) ) {
+ # Media link; trail not supported.
+ $linkRegexp = '/\[\[(.*?)\]\]/';
+ $title = Title::makeTitleSafe( NS_FILE, $submatch[1] );
+ if ( $title ) {
+ $thelink = Linker::makeMediaLinkObj( $title, $text );
+ }
+ } else {
+ # Other kind of link
+ if ( preg_match( $wgContLang->linkTrail(), $match[3], $submatch ) ) {
+ $trail = $submatch[1];
+ } else {
+ $trail = "";
+ }
+ $linkRegexp = '/\[\[(.*?)\]\]' . preg_quote( $trail, '/' ) . '/';
+ if ( isset( $match[1][0] ) && $match[1][0] == ':' ) {
+ $match[1] = substr( $match[1], 1 );
+ }
+ list( $inside, $trail ) = Linker::splitTrail( $trail );
+
+ $linkText = $text;
+ $linkTarget = Linker::normalizeSubpageLink( $title, $match[1], $linkText );
+
+ $target = Title::newFromText( $linkTarget );
+ if ( $target ) {
+ if ( $target->getText() == '' && !$target->isExternal()
+ && !$local && $title
+ ) {
+ $newTarget = clone ( $title );
+ $newTarget->setFragment( '#' . $target->getFragment() );
+ $target = $newTarget;
+ }
+ $thelink = Linker::link(
+ $target,
+ $linkText . $inside
+ ) . $trail;
+ }
+ }
+ if ( $thelink ) {
+ // If the link is still valid, go ahead and replace it in!
+ $comment = preg_replace(
+ $linkRegexp,
+ StringUtils::escapeRegexReplacement( $thelink ),
+ $comment,
+ 1
+ );
}
- $thelink = self::link(
- $target,
- $linkText . $inside
- ) . $trail;
- }
- }
- if ( $thelink ) {
- // If the link is still valid, go ahead and replace it in!
- $comment = preg_replace( $linkRegexp, StringUtils::escapeRegexReplacement( $thelink ), $comment, 1 );
- }
- return $comment;
+ return $comment;
+ },
+ $comment
+ );
}
/**
- * @param $contextTitle Title
- * @param $target
- * @param $text
+ * @param Title $contextTitle
+ * @param string $target
+ * @param string $text
* @return string
*/
public static function normalizeSubpageLink( $contextTitle, $target, &$text ) {
@@ -1573,9 +1560,9 @@ class Linker {
* Wrap a comment in standard punctuation and formatting if
* it's non-empty, otherwise return empty string.
*
- * @param $comment String
- * @param $title Mixed: Title object (to generate link to section in autocomment) or null
- * @param $local Boolean: whether section links should refer to local page
+ * @param string $comment
+ * @param Title|null $title Title object (to generate link to section in autocomment) or null
+ * @param bool $local Whether section links should refer to local page
*
* @return string
*/
@@ -1596,10 +1583,10 @@ class Linker {
* Wrap and format the given revision's comment block, if the current
* user is allowed to view it.
*
- * @param $rev Revision object
- * @param $local Boolean: whether section links should refer to local page
- * @param $isPublic Boolean: show only if all users can see it
- * @return String: HTML fragment
+ * @param Revision $rev
+ * @param bool $local Whether section links should refer to local page
+ * @param bool $isPublic Show only if all users can see it
+ * @return string HTML fragment
*/
public static function revComment( Revision $rev, $local = false, $isPublic = false ) {
if ( $rev->getRawComment() == "" ) {
@@ -1620,7 +1607,7 @@ class Linker {
}
/**
- * @param $size
+ * @param int $size
* @return string
*/
public static function formatRevisionSize( $size ) {
@@ -1645,6 +1632,7 @@ class Linker {
/**
* Finish one or more sublevels on the Table of Contents
*
+ * @param int $level
* @return string
*/
public static function tocUnindent( $level ) {
@@ -1654,6 +1642,11 @@ class Linker {
/**
* parameter level defines if we are on an indentation level
*
+ * @param string $anchor
+ * @param string $tocline
+ * @param string $tocnumber
+ * @param string $level
+ * @param string|bool $sectionIndex
* @return string
*/
public static function tocLine( $anchor, $tocline, $tocnumber, $level, $sectionIndex = false ) {
@@ -1680,9 +1673,9 @@ class Linker {
/**
* Wraps the TOC in a table and provides the hide/collapse javascript.
*
- * @param string $toc html of the Table Of Contents
- * @param $lang String|Language|false: Language for the toc title, defaults to user language
- * @return String: full html of the TOC
+ * @param string $toc Html of the Table Of Contents
+ * @param string|Language|bool $lang Language for the toc title, defaults to user language
+ * @return string Full html of the TOC
*/
public static function tocList( $toc, $lang = false ) {
$lang = wfGetLangObj( $lang );
@@ -1699,7 +1692,7 @@ class Linker {
* Currently unused.
*
* @param array $tree Return value of ParserOutput::getSections()
- * @return String: HTML fragment
+ * @return string HTML fragment
*/
public static function generateTOC( $tree ) {
$toc = '';
@@ -1726,19 +1719,21 @@ class Linker {
/**
* Create a headline for content
*
- * @param $level Integer: the level of the headline (1-6)
- * @param string $attribs any attributes for the headline, starting with
- * a space and ending with '>'
- * This *must* be at least '>' for no attribs
- * @param string $anchor the anchor to give the headline (the bit after the #)
- * @param string $html html for the text of the header
+ * @param int $level The level of the headline (1-6)
+ * @param string $attribs Any attributes for the headline, starting with
+ * a space and ending with '>'
+ * This *must* be at least '>' for no attribs
+ * @param string $anchor The anchor to give the headline (the bit after the #)
+ * @param string $html Html for the text of the header
* @param string $link HTML to add for the section edit link
- * @param $legacyAnchor Mixed: a second, optional anchor to give for
+ * @param bool|string $legacyAnchor A second, optional anchor to give for
* backward compatibility (false to omit)
*
- * @return String: HTML headline
+ * @return string HTML headline
*/
- public static function makeHeadline( $level, $attribs, $anchor, $html, $link, $legacyAnchor = false ) {
+ public static function makeHeadline( $level, $attribs, $anchor, $html,
+ $link, $legacyAnchor = false
+ ) {
$ret = "<h$level$attribs"
. "<span class=\"mw-headline\" id=\"$anchor\">$html</span>"
. $link
@@ -1752,6 +1747,7 @@ class Linker {
/**
* Split a link trail, return the "inside" portion and the remainder of the trail
* as a two-element array
+ * @param string $trail
* @return array
*/
static function splitTrail( $trail ) {
@@ -1788,15 +1784,18 @@ class Linker {
*
* If the option noBrackets is set the rollback link wont be enclosed in []
*
- * @param $rev Revision object
- * @param $context IContextSource context to use or null for the main context.
- * @param $options array
+ * @param Revision $rev
+ * @param IContextSource $context Context to use or null for the main context.
+ * @param array $options
* @return string
*/
- public static function generateRollback( $rev, IContextSource $context = null, $options = array( 'verify' ) ) {
+ public static function generateRollback( $rev, IContextSource $context = null,
+ $options = array( 'verify' )
+ ) {
if ( $context === null ) {
$context = RequestContext::getMain();
}
+
$editCount = false;
if ( in_array( 'verify', $options ) ) {
$editCount = self::getRollbackEditCount( $rev, true );
@@ -1825,9 +1824,9 @@ class Linker {
* Returns null if $wgShowRollbackEditCount is disabled or false if $verify
* is set and the user is the only contributor of the page.
*
- * @param $rev Revision object
+ * @param Revision $rev
* @param bool $verify Try to verify that this revision can really be rolled back
- * @return integer|bool|null
+ * @return int|bool|null
*/
public static function getRollbackEditCount( $rev, $verify ) {
global $wgShowRollbackEditCount;
@@ -1856,9 +1855,13 @@ class Linker {
$moreRevs = false;
foreach ( $res as $row ) {
if ( $rev->getRawUserText() != $row->rev_user_text ) {
- if ( $verify && ( $row->rev_deleted & Revision::DELETED_TEXT || $row->rev_deleted & Revision::DELETED_USER ) ) {
- // If the user or the text of the revision we might rollback to is deleted in some way we can't rollback
- // Similar to the sanity checks in WikiPage::commitRollback
+ if ( $verify &&
+ ( $row->rev_deleted & Revision::DELETED_TEXT
+ || $row->rev_deleted & Revision::DELETED_USER
+ ) ) {
+ // If the user or the text of the revision we might rollback
+ // to is deleted in some way we can't rollback. Similar to
+ // the sanity checks in WikiPage::commitRollback.
return false;
}
$moreRevs = true;
@@ -1879,12 +1882,14 @@ class Linker {
/**
* Build a raw rollback link, useful for collections of "tool" links
*
- * @param $rev Revision object
- * @param $context IContextSource context to use or null for the main context.
- * @param $editCount integer Number of edits that would be reverted
- * @return String: HTML fragment
+ * @param Revision $rev
+ * @param IContextSource|null $context Context to use or null for the main context.
+ * @param int $editCount Number of edits that would be reverted
+ * @return string HTML fragment
*/
- public static function buildRollbackLink( $rev, IContextSource $context = null, $editCount = false ) {
+ public static function buildRollbackLink( $rev, IContextSource $context = null,
+ $editCount = false
+ ) {
global $wgShowRollbackEditCount, $wgMiserMode;
// To config which pages are effected by miser mode
@@ -1898,7 +1903,10 @@ class Linker {
$query = array(
'action' => 'rollback',
'from' => $rev->getUserText(),
- 'token' => $context->getUser()->getEditToken( array( $title->getPrefixedText(), $rev->getUserText() ) ),
+ 'token' => $context->getUser()->getEditToken( array(
+ $title->getPrefixedText(),
+ $rev->getUserText()
+ ) ),
);
if ( $context->getRequest()->getBool( 'bot' ) ) {
$query['bot'] = '1';
@@ -1915,13 +1923,17 @@ class Linker {
}
}
- if ( !$disableRollbackEditCount && is_int( $wgShowRollbackEditCount ) && $wgShowRollbackEditCount > 0 ) {
+ if ( !$disableRollbackEditCount
+ && is_int( $wgShowRollbackEditCount )
+ && $wgShowRollbackEditCount > 0
+ ) {
if ( !is_numeric( $editCount ) ) {
$editCount = self::getRollbackEditCount( $rev, false );
}
if ( $editCount > $wgShowRollbackEditCount ) {
- $editCount_output = $context->msg( 'rollbacklinkcount-morethan' )->numParams( $wgShowRollbackEditCount )->parse();
+ $editCount_output = $context->msg( 'rollbacklinkcount-morethan' )
+ ->numParams( $wgShowRollbackEditCount )->parse();
} else {
$editCount_output = $context->msg( 'rollbacklinkcount' )->numParams( $editCount )->parse();
}
@@ -1957,9 +1969,11 @@ class Linker {
* @param bool $preview Whether this is for a preview
* @param bool $section Whether this is for a section edit
* @param Title|Message|string|null $more An escaped link for "More..." of the templates
- * @return String: HTML output
+ * @return string HTML output
*/
- public static function formatTemplates( $templates, $preview = false, $section = false, $more = null ) {
+ public static function formatTemplates( $templates, $preview = false,
+ $section = false, $more = null
+ ) {
global $wgLang;
wfProfileIn( __METHOD__ );
@@ -2048,9 +2062,9 @@ class Linker {
/**
* Returns HTML for the "hidden categories on this page" list.
*
- * @param array $hiddencats of hidden categories from Article::getHiddenCategories
- * or similar
- * @return String: HTML output
+ * @param array $hiddencats Array of hidden categories from Article::getHiddenCategories
+ * or similar
+ * @return string HTML output
*/
public static function formatHiddenCategories( $hiddencats ) {
wfProfileIn( __METHOD__ );
@@ -2063,7 +2077,10 @@ class Linker {
$outText .= "</div><ul>\n";
foreach ( $hiddencats as $titleObj ) {
- $outText .= '<li>' . self::link( $titleObj, null, array(), array(), 'known' ) . "</li>\n"; # If it's hidden, it must exist - no need to check with a LinkBatch
+ # If it's hidden, it must exist - no need to check with a LinkBatch
+ $outText .= '<li>'
+ . self::link( $titleObj, null, array(), array(), 'known' )
+ . "</li>\n";
}
$outText .= '</ul>';
}
@@ -2076,7 +2093,7 @@ class Linker {
* unit (B, KB, MB or GB) according to the magnitude in question
*
* @param int $size Size to format
- * @return String
+ * @return string
*/
public static function formatSize( $size ) {
global $wgLang;
@@ -2089,10 +2106,10 @@ class Linker {
* isn't always, because sometimes the accesskey needs to go on a different
* element than the id, for reverse-compatibility, etc.)
*
- * @param string $name id of the element, minus prefixes.
- * @param $options Mixed: null or the string 'withaccess' to add an access-
+ * @param string $name Id of the element, minus prefixes.
+ * @param string|null $options Null or the string 'withaccess' to add an access-
* key hint
- * @return String: contents of the title attribute (which you must HTML-
+ * @return string Contents of the title attribute (which you must HTML-
* escape), or false for no title attribute
*/
public static function titleAttrib( $name, $options = null ) {
@@ -2115,10 +2132,12 @@ class Linker {
if ( $options == 'withaccess' ) {
$accesskey = self::accesskey( $name );
if ( $accesskey !== false ) {
+ // Should be build the same as in jquery.accessKeyLabel.js
if ( $tooltip === false || $tooltip === '' ) {
- $tooltip = "[$accesskey]";
+ $tooltip = wfMessage( 'brackets', $accesskey )->text();
} else {
- $tooltip .= " [$accesskey]";
+ $tooltip .= wfMessage( 'word-separator' )->text();
+ $tooltip .= wfMessage( 'brackets', $accesskey )->text();
}
}
}
@@ -2127,7 +2146,7 @@ class Linker {
return $tooltip;
}
- static $accesskeycache;
+ public static $accesskeycache;
/**
* Given the id of an interface element, constructs the appropriate
@@ -2135,8 +2154,8 @@ class Linker {
* the id but isn't always, because sometimes the accesskey needs to go on
* a different element than the id, for reverse-compatibility, etc.)
*
- * @param string $name id of the element, minus prefixes.
- * @return String: contents of the accesskey attribute (which you must HTML-
+ * @param string $name Id of the element, minus prefixes.
+ * @return string Contents of the accesskey attribute (which you must HTML-
* escape), or false for no accesskey attribute
*/
public static function accesskey( $name ) {
@@ -2160,7 +2179,8 @@ class Linker {
}
wfProfileOut( __METHOD__ );
- return self::$accesskeycache[$name] = $accesskey;
+ self::$accesskeycache[$name] = $accesskey;
+ return self::$accesskeycache[$name];
}
/**
@@ -2173,7 +2193,7 @@ class Linker {
*
* @param User $user
* @param Revision $rev
- * @param Revision $title
+ * @param Title $title
* @return string HTML fragment
*/
public static function getRevDeleteLink( User $user, Revision $rev, Title $title ) {
@@ -2210,11 +2230,11 @@ class Linker {
/**
* Creates a (show/hide) link for deleting revisions/log entries
*
- * @param array $query query parameters to be passed to link()
- * @param $restricted Boolean: set to true to use a "<strong>" instead of a "<span>"
- * @param $delete Boolean: set to true to use (show/hide) rather than (show)
+ * @param array $query Query parameters to be passed to link()
+ * @param bool $restricted Set to true to use a "<strong>" instead of a "<span>"
+ * @param bool $delete Set to true to use (show/hide) rather than (show)
*
- * @return String: HTML "<a>" link to Special:Revisiondelete, wrapped in a
+ * @return string HTML "<a>" link to Special:Revisiondelete, wrapped in a
* span to allow for customization of appearance with CSS
*/
public static function revDeleteLink( $query = array(), $restricted = false, $delete = true ) {
@@ -2223,13 +2243,17 @@ class Linker {
$html = wfMessage( $msgKey )->escaped();
$tag = $restricted ? 'strong' : 'span';
$link = self::link( $sp, $html, array(), $query, array( 'known', 'noclasses' ) );
- return Xml::tags( $tag, array( 'class' => 'mw-revdelundel-link' ), wfMessage( 'parentheses' )->rawParams( $link )->escaped() );
+ return Xml::tags(
+ $tag,
+ array( 'class' => 'mw-revdelundel-link' ),
+ wfMessage( 'parentheses' )->rawParams( $link )->escaped()
+ );
}
/**
* Creates a dead (show/hide) link for deleting revisions/log entries
*
- * @param $delete Boolean: set to true to use (show/hide) rather than (show)
+ * @param bool $delete Set to true to use (show/hide) rather than (show)
*
* @return string HTML text wrapped in a span to allow for customization
* of appearance with CSS
@@ -2244,46 +2268,19 @@ class Linker {
/* Deprecated methods */
/**
- * @deprecated since 1.16 Use link()
- *
- * This function is a shortcut to makeBrokenLinkObj(Title::newFromText($title),...). Do not call
- * it if you already have a title object handy. See makeBrokenLinkObj for further documentation.
- *
- * @param string $title The text of the title
- * @param string $text Link text
- * @param string $query Optional query part
- * @param string $trail 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 );
- } else {
- wfDebug( 'Invalid title passed to self::makeBrokenLink(): "' . $title . "\"\n" );
- return $text == '' ? $title : $text;
- }
- }
-
- /**
* @deprecated since 1.16 Use link(); warnings since 1.21
*
* Make a link for a title which may or may not be in the database. If you need to
* call this lots of times, pre-fill the link cache with a LinkBatch, otherwise each
* call to this will result in a DB query.
*
- * @param $nt Title: the title object to make the link from, e.g. from
- * Title::newFromText.
- * @param $text String: link text
- * @param string $query optional query part
- * @param string $trail 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.
- * @param string $prefix optional prefix. As trail, only before instead of after.
+ * @param Title $nt The title object to make the link from, e.g. from Title::newFromText.
+ * @param string $text Link text
+ * @param string $query Optional query part
+ * @param string $trail 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.
+ * @param string $prefix Optional prefix. As trail, only before instead of after.
* @return string
*/
static function makeLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
@@ -2309,14 +2306,14 @@ class Linker {
* it doesn't have to do a database query. It's also valid for interwiki titles and special
* pages.
*
- * @param $title Title object of target page
- * @param $text String: text to replace the title
- * @param $query String: link target
- * @param $trail String: text after link
- * @param string $prefix text before link text
- * @param string $aprops extra attributes to the a-element
- * @param $style String: style to apply - if empty, use getInternalLinkAttributesObj instead
- * @return string the a-element
+ * @param Title $title Title object of target page
+ * @param string $text Text to replace the title
+ * @param string $query Link target
+ * @param string $trail Text after link
+ * @param string $prefix Text before link text
+ * @param string $aprops Extra attributes to the a-element
+ * @param string $style Style to apply - if empty, use getInternalLinkAttributesObj instead
+ * @return string The a-element
*/
static function makeKnownLinkObj(
$title, $text = '', $query = '', $trail = '', $prefix = '', $aprops = '', $style = ''
@@ -2343,64 +2340,8 @@ class Linker {
}
/**
- * @deprecated since 1.16 Use link()
- *
- * Make a red link to the edit page of a given title.
- *
- * @param $title Title object of the target page
- * @param $text String: Link text
- * @param string $query Optional query part
- * @param string $trail 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.
- * @param string $prefix Optional prefix
- * @return string
- */
- static function makeBrokenLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '' ) {
- wfDeprecated( __METHOD__, '1.16' );
-
- wfProfileIn( __METHOD__ );
-
- list( $inside, $trail ) = self::splitTrail( $trail );
- if ( $text === '' ) {
- $text = self::linkText( $title );
- }
-
- $ret = self::link( $title, "$prefix$text$inside", array(),
- wfCgiToArray( $query ), 'broken' ) . $trail;
-
- wfProfileOut( __METHOD__ );
- return $ret;
- }
-
- /**
- * @deprecated since 1.16 Use link()
- *
- * Make a coloured link.
- *
- * @param $nt Title object of the target page
- * @param $colour Integer: colour of the link
- * @param $text String: link text
- * @param $query String: optional query part
- * @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.
- * @param string $prefix 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 {
- $style = '';
- }
- return self::makeKnownLinkObj( $nt, $text, $query, $trail, $prefix, '', $style );
- }
-
- /**
* Returns the attributes for the tooltip and access key.
+ * @param string $name
* @return array
*/
public static function tooltipAndAccesskeyAttribs( $name ) {
@@ -2422,6 +2363,8 @@ class Linker {
/**
* Returns raw bits of HTML, use titleAttrib()
+ * @param string $name
+ * @param array|null $options
* @return null|string
*/
public static function tooltip( $name, $options = null ) {