X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2FLinker.php;h=a0332cf615cb9716f02b2f05f034a5488b6c4f89;hp=aedb704a8fe055b1b59542da2f75ee9eb5af2bac;hb=c8e482371407477ecd4f0a1b5778e565d3963a93;hpb=de1e6c62673ee458afc019e8f064d03d3e263600 diff --git a/includes/Linker.php b/includes/Linker.php index aedb704a8f..a0332cf615 100644 --- a/includes/Linker.php +++ b/includes/Linker.php @@ -76,7 +76,7 @@ class Linker { * @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 element, i.e., * the link text. This is raw HTML and will not be escaped. If null, @@ -107,8 +107,8 @@ class Linker { 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 "$html"; } @@ -892,10 +892,26 @@ class Linker { */ 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 { @@ -903,11 +919,12 @@ class Linker { } // Wrap the output with tags for directionality isolation - return self::link( - $page, - '' . htmlspecialchars( $altUserName !== false ? $altUserName : $userName ) . '', - [ 'class' => $classes ] - ); + $linkText = + '' . htmlspecialchars( $altUserName !== false ? $altUserName : $userName ) . ''; + + return $page + ? self::link( $page, $linkText, [ 'class' => $classes ] ) + : Html::rawElement( 'span', [ 'class' => $classes ], $linkText ); } /** @@ -931,6 +948,11 @@ class Linker { $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 ); @@ -1175,7 +1197,7 @@ class Linker { $sectionTitle = Title::newFromText( '#' . $section ); } else { $sectionTitle = Title::makeTitleSafe( $title->getNamespace(), - $title->getDBkey(), $section ); + $title->getDBkey(), Sanitizer::decodeCharReferences( $section ) ); } if ( $sectionTitle ) { $link = Linker::makeCommentLink( $sectionTitle, $wgLang->getArrow(), $wikiId, 'noclasses' ); @@ -1291,9 +1313,7 @@ class Linker { 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; @@ -1321,7 +1341,7 @@ class Linker { * * @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. @@ -1330,23 +1350,23 @@ class Linker { * @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; @@ -1539,10 +1559,16 @@ class Linker { if ( $sectionIndex !== false ) { $classes .= " tocsection-$sectionIndex"; } - return "\n
  • ' . - $tocnumber . ' ' . - $tocline . ''; + + // \n
  • + // $tocnumber $tocline + return "\n" . Html::openElement( 'li', [ 'class' => $classes ] ) + . Html::rawElement( 'a', + [ 'href' => "#$anchor" ], + Html::element( 'span', [ 'class' => 'tocnumber' ], $tocnumber ) + . ' ' + . Html::rawElement( 'span', [ 'class' => 'toctext' ], $tocline ) + ); } /**