* @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
* @deprecated since 1.28, use MediaWiki\Linker\LinkRenderer instead
*
- * @param Title $target Can currently only be a Title, but this may
+ * @param LinkTarget $target Can currently only be a LinkTarget, but this may
* change to support Images, literal URLs, etc.
* @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,
public static function link(
$target, $html = null, $customAttribs = [], $query = [], $options = []
) {
- if ( !$target instanceof Title ) {
- wfWarn( __METHOD__ . ': Requires $target to be a Title object.', 2 );
+ if ( !$target instanceof LinkTarget ) {
+ wfWarn( __METHOD__ . ': Requires $target to be a LinkTarget object.', 2 );
return "<!-- ERROR -->$html";
}
*/
public static function userLink( $userId, $userName, $altUserName = false ) {
$classes = 'mw-userlink';
+ $page = null;
if ( $userId == 0 ) {
- $page = SpecialPage::getTitleFor( 'Contributions', $userName );
- if ( $altUserName === false ) {
- $altUserName = IP::prettifyIP( $userName );
+ $pos = strpos( $userName, '>' );
+ if ( $pos !== false ) {
+ $iw = explode( ':', substr( $userName, 0, $pos ) );
+ $firstIw = array_shift( $iw );
+ $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
+ if ( $interwikiLookup->isValidInterwiki( $firstIw ) ) {
+ $title = MWNamespace::getCanonicalName( NS_USER ) . ':' . substr( $userName, $pos + 1 );
+ if ( $iw ) {
+ $title = join( ':', $iw ) . ':' . $title;
+ }
+ $page = Title::makeTitle( NS_MAIN, $title, '', $firstIw );
+ }
+ $classes .= ' mw-extuserlink';
+ } else {
+ $page = SpecialPage::getTitleFor( 'Contributions', $userName );
+ if ( $altUserName === false ) {
+ $altUserName = IP::prettifyIP( $userName );
+ }
}
$classes .= ' mw-anonuserlink'; // Separate link class for anons (T45179)
} else {
}
// Wrap the output with <bdi> tags for directionality isolation
- return self::link(
- $page,
- '<bdi>' . htmlspecialchars( $altUserName !== false ? $altUserName : $userName ) . '</bdi>',
- [ 'class' => $classes ]
- );
+ $linkText =
+ '<bdi>' . htmlspecialchars( $altUserName !== false ? $altUserName : $userName ) . '</bdi>';
+
+ return $page
+ ? self::link( $page, $linkText, [ 'class' => $classes ] )
+ : Html::rawElement( 'span', [ 'class' => $classes ], $linkText );
}
/**
$blockable = !( $flags & self::TOOL_LINKS_NOBLOCK );
$addEmailLink = $flags & self::TOOL_LINKS_EMAIL && $userId;
+ if ( $userId == 0 && strpos( $userText, '>' ) !== false ) {
+ // No tools for an external user
+ return '';
+ }
+
$items = [];
if ( $talkable ) {
$items[] = self::userTalkLink( $userId, $userText );
$section = str_replace( '[[', '', $section );
$section = str_replace( ']]', '', $section );
- $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # T24784
+ $section = substr( Parser::guessSectionNameFromStrippedText( $section ), 1 );
if ( $local ) {
- $sectionTitle = Title::newFromText( '#' . $section );
+ $sectionTitle = Title::makeTitleSafe( NS_MAIN, '', $section );
} else {
$sectionTitle = Title::makeTitleSafe( $title->getNamespace(),
$title->getDBkey(), $section );
if ( $target->getText() == '' && !$target->isExternal()
&& !$local && $title
) {
- $newTarget = clone $title;
- $newTarget->setFragment( '#' . $target->getFragment() );
- $target = $newTarget;
+ $target = $title->createFragmentTarget( $target->getFragment() );
}
$thelink = Linker::makeCommentLink( $target, $linkText . $inside, $wikiId ) . $trail;
*
* @note This is only public for technical reasons. It's not intended for use outside Linker.
*
- * @param Title $title
+ * @param LinkTarget $linkTarget
* @param string $text
* @param string|null $wikiId Id of the wiki to link to (if not the local wiki),
* as used by WikiMap.
* @return string HTML link
*/
public static function makeCommentLink(
- Title $title, $text, $wikiId = null, $options = []
+ LinkTarget $linkTarget, $text, $wikiId = null, $options = []
) {
- if ( $wikiId !== null && !$title->isExternal() ) {
+ if ( $wikiId !== null && !$linkTarget->isExternal() ) {
$link = self::makeExternalLink(
WikiMap::getForeignURL(
$wikiId,
- $title->getNamespace() === 0
- ? $title->getDBkey()
- : MWNamespace::getCanonicalName( $title->getNamespace() ) . ':'
- . $title->getDBkey(),
- $title->getFragment()
+ $linkTarget->getNamespace() === 0
+ ? $linkTarget->getDBkey()
+ : MWNamespace::getCanonicalName( $linkTarget->getNamespace() ) . ':'
+ . $linkTarget->getDBkey(),
+ $linkTarget->getFragment()
),
$text,
/* escape = */ false // Already escaped
);
} else {
- $link = self::link( $title, $text, [], [], $options );
+ $link = self::link( $linkTarget, $text, [], [], $options );
}
return $link;