Benutzer:Fomafix/Gadget-redirecttitle.js
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 );
} );