Benutzer:Fomafix/Gadget-redirecttitle.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
/*
 * Dieses Gadget fügt bei Links auf Weiterleitungen das Weiterleitungsziel im Tooltip hinzu.
 *
 * @author Fomafix, 2012-2023
 * dependencies=jquery.ui,mediawiki.api,mediawiki.util
 */
mw.messages.set( 'redirect-title', '$1 → $2' );
mw.messages.set( 'redirect-title-fragment', '$1 → $2 # $3' );
/* If you just want the redirect destination as title use mw.messages.set( 'redirect-title', '$2' ); */

mw.loader.using( [ 'mediawiki.api', 'mediawiki.util' ] )
.done( function () {
	var deferreds = Object.create( null ),
		props = Object.create( null ),
		titles = [];

	function ok( res ) {
		if ( !res.query ) {
			return;
		}
		if ( res.query.normalized ) {
			res.query.normalized.forEach( function ( normalize ) {
				if ( normalize.from in deferreds ) {
					deferreds[ normalize.to ] = deferreds[ normalize.from ];
					delete deferreds[ normalize.from ];
				}
			} );
		}
		if ( res.query.pages ) {
			res.query.pages.forEach( function ( page ) {
				if ( page.pageprops ) {
					props[ page.title ] = page.pageprops;
				}
			} );
		}
		if ( res.query.redirects ) {
			res.query.redirects.forEach( function ( redirect ) {
				if ( redirect.from in deferreds ) {
					deferreds[ redirect.from ].resolve( redirect );
				}
			} );
		}
	}

	function query( titles ) {
		var api = new mw.Api();

		api.get( {
			formatversion: 2,
			action: 'query',
			titles: titles,
			prop: 'pageprops',
			redirects: true
		} )
		.done( ok );
	}

	function getTarget( title ) {
		var deferred;
		if ( title in deferreds ) {
			deferred = deferreds[ title ];
		} else {
			titles.push( title );
			if ( titles.length >= 50 ) {
				query( titles );
				titles = [];
			}
			deferred = $.Deferred();
			deferreds[ title ] = deferred;
		}
		return deferred.promise();
	}

	function getTitleFromURL( url ) {
		url = new URL( url );
		if ( url.pathname.startsWith( '/wiki/' ) ) {
			return decodeURIComponent( url.pathname.substring( 6 ) );
		}
		if ( url.pathname === mw.config.get( 'wgScript' ) ) {
			return url.searchParams.get( 'title' );
		}
		return null;
	}

	function execute( $content ) {
		$content.find( 'a.mw-redirect[href]' )
		.each( function ( index, object ) {
			var title = getTitleFromURL( object.href );
			if ( !title ) {
				return;
			}
			title = title.replace( /_/g, ' ' );
			getTarget( title )
			.done( function ( redirect ) {
				var href, text,
					$object = $( object ),
					$parent = $object.parent();
				if ( $parent.hasClass( 'redirect-in-category' ) ||
					$parent.hasClass( 'allpagesredirect' )
				) {
					href = mw.util.getUrl( redirect.to );
					text = redirect.to;
					if ( redirect.tofragment ) {
						href += '#' + mw.util.escapeIdForLink( redirect.tofragment );
						text += '#' + redirect.tofragment;
					}
					$parent.append(
						' → ',
						$( '<a>' )
						.attr( {
							href: href,
						} )
						.text( text )
					);
					if ( redirect.to in props && 'wikibase_item' in props[ redirect.to ] ) {
						$parent.append(
							$( '<sup>' ).append(
								$( '<a>' )
								.attr( {
									href: 'https://www.wikidata.org/wiki/' + props[ redirect.to ].wikibase_item,
								} )
								.text( 'WD' )
							)
						);
					}
					$object
					.attr( 'href', function ( index, url ) {
						return url + (
							url.includes( '?' )
							? '&redirect=no'
							: '?redirect=no'
						);
					} );
				} else {
					mw.loader.using( 'jquery.ui', function () {
						$object.tooltip( {
							content: redirect.tofragment
								? mw.msg(
									'redirect-title-fragment',
									redirect.from,
									redirect.to,
									redirect.tofragment
								) : mw.msg(
									'redirect-title',
									redirect.from,
									redirect.to
								)
						} );
					} );
				}
			} );
		} );
		if ( titles.length ) {
			query( titles );
			titles = [];
		}
	}

	mw.hook( 'wikipage.content' ).add( execute );
} );