User:ValterVB/Dis.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 * On request adds an icon to sitelinks that link to a disambiguation or a redirect.
 * 
 * To use it add this to your common.js:
 * // [[User:Matěj Suchánek/checkSitelinks.js]]
 * mw.loader.load( '//www.wikidata.org/w/index.php?title=User:Matěj_Suchánek/checkSitelinks.js&action=raw&ctype=text/javascript' );
 * 
 * You are welcome to suggest more special cases this script could indicate.
 * 
 * Author: Matěj Suchánek
 * Idea: ValterVB
 */

( function ( mw, $ ) {

	if ( mw.config.get( 'wgNamespaceNumber' ) !== 0 ||
		!mw.config.exists( 'wbEntity' )
	) {
		return;
	}

	var sitelinks = JSON.parse( mw.config.get( 'wbEntity' ) ).sitelinks;

	var checker = $( '<span>' )
		.addClass( 'checker' )
		.append( '[' )
		.append(
			$( '<a>' )
			.attr( 'href', '#' )
			.text( 'Check sitelinks!' )
		)
		.append( ']' );

	function main() {
		$( '.wikibase-sitelinkgroupview' ).find( '.wikibase-edittoolbar-container' ).append( checker );
		$( '.checker' ).each( function() {
			var groupview = $( this ).closest( '.wikibase-sitelinkgroupview' );
			var group = groupview.data( 'wb-sitelinks-group' );
			var sitelinks = groupview.find( '.wikibase-sitelinkview.listview-item' );
			if ( sitelinks.length === 0 ) {
				$( this ).hide();
			} else {
				var icon = $( '<span>' ).addClass( 'sitelink-icon sitelink-icon-hidden sitelink-icon-' + group );
				sitelinks.append( icon );
			}
		});

		$( '.checker' ).on( 'click', 'a', function( event ) {
			event.preventDefault();
			var sitelinkgroupview = $( this ).closest( '.wikibase-sitelinkgroupview' );
			var group = sitelinkgroupview.data( 'wb-sitelinks-group' );
			$( '.disambig-icon.sitelink-icon-' + group )
				.addClass( 'sitelink-icon-hidden' )
				.removeClass( 'disambig-icon' );
			$( '.redirect-icon.sitelink-icon-' + group )
				.addClass( 'sitelink-icon-hidden' )
				.removeClass( 'redirect-icon' );
			sitelinkgroupview.find( '.wikibase-sitelinkview.listview-item' ).each( function() {
				var site = $( this ).data( 'wb-siteid' );
				if ( site in sitelinks ) {
					var split = site.match( /^(.*)(wiki[a-z]*)$/i );
					var language = split[1];
					var family = split[2];
					switch ( language ) {
						case 'meta':
						case 'commons':
						case 'species':
							family = 'wikimedia';
							break;
						case 'mediawiki':
						case 'wikidata':
							return;
						default:
							language = language.replace( /_/g, '-' );
							if ( family === 'wiki' ) {
								family = 'wikipedia';
							}
					}
					var page = sitelinks[site].title;
					var $this = $( this );
					$.ajax( {
						url: '//' + language + '.' + family + '.org/w/api.php',
						data: {
							'action': 'query',
							'format': 'json',
							'indexpageids': '',
							'ppprop': 'disambiguation',
							'prop': 'pageprops',
							'redirects': '',
							'titles': page
						},
						dataType: 'jsonp',
						success: function( data ) {
							var icon = $this.find( '.sitelink-icon-' + group );
							if ( 'redirects' in data.query ) {
								icon.addClass( 'redirect-icon' ).removeClass( 'sitelink-icon-hidden' );
							} else if ( 'pageprops' in data.query.pages[data.query.pageids[0]] ) {
								icon.addClass( 'disambig-icon' ).removeClass( 'sitelink-icon-hidden' );
							} 
						}
					} );
				}
			} );
		} );
	}

	mw.loader.load( '//www.wikidata.org/w/index.php?title=User:Matěj_Suchánek/checkSitelinks.css&action=raw&ctype=text/css', 'text/css' );
	$( main );

} ( mediaWiki, jQuery ) );