User:Matěj Suchánek/markDisambigs.js

From Wikidata
Jump to navigation Jump to search

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.
// <nowiki>
( function( mw, wb, $ ) {

	if ( [ 0, 120 ].indexOf( mw.config.get( 'wgNamespaceNumber' ) ) === -1 ) { // fixme: 146 [[phab:T196349]]
		return;
	}

	var api, repoApi,
		selectors = [];

	function doSnak( snak ) {
		return snak.datavalue && snak.datavalue.type == 'wikibase-entityid';
	}

	function idFromSnak( snak ) {
		return snak.datavalue.value.id;
	}

	function pushIfNotIn( items, snak ) {
		var id = idFromSnak( snak );
		if ( items.indexOf( id ) === -1 ) {
			items.push( id );
		}
	}

	function addIndicators() {
		if ( !selectors.length ) {
			return;
		}

		mw.util.addCSS( '.mw-disambig { padding-right: 30px; ' +
			'background: url("https://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Disambig.svg/20px-Disambig.svg.png") no-repeat right; }' );

		$.each( selectors, function ( i, selector ) {
			$( selector )
			.addClass( 'mw-disambig' );
		} );
	}

	function nextBatch( items ) {
		if ( !items.length ) {
			$( addIndicators );
			return;
		}
		var batch = [];
		while ( items.length ) {
			batch.push( items.pop() );
			if ( batch.length == 50 ) {
				break;
			}
		}
		repoApi.getEntities( batch, 'claims' ).done( function( data ) {
			$.each( data.entities, function( entityId, entity ) {
				for ( var i in entity.claims.P31 || [] ) {
					if (
						entity.claims.P31[i].mainsnak.datavalue &&
						entity.claims.P31[i].mainsnak.datavalue.value.id == 'Q4167410'
					) {
						selectors.push( '.wikibase-snakview-value > a[href$="' + entityId + '"]' );
						break;
					}
				}
			} );
			nextBatch( items );
		} );
	}

	var apiLoaded = mw.loader.using( [ 'mediawiki.api', 'mediawiki.util', 'wikibase.api.RepoApi' ] )
	.then( function () {
		api = new mw.Api();
		repoApi = new wb.api.RepoApi( api );
	} );

	// TODO: hook for new statements

	mw.hook( 'wikibase.entityPage.entityLoaded' ).add( function ( entity ) {
		var items = [];
		$.each( entity.claims || {}, function( prop, claims ) {
			$.each( claims, function( i, claim ) {
				if ( doSnak( claim.mainsnak ) ) {
					pushIfNotIn( items, claim.mainsnak );
				}
				$.each( claim.qualifiers || {}, function( qprop, qualifiers ) {
					$.each( qualifiers, function( j, qualifier ) {
						if ( doSnak( qualifier ) ) {
							pushIfNotIn( items, qualifier );
						}
					} );
				} );
				$.each( claim.references || [], function( j, ref ) {
					$.each( ref.snaks, function( refprop, snaks ) {
						$.each( snaks, function( k, snak ) {
							if ( doSnak( snak ) ) {
								pushIfNotIn( items, snak );
							}
						} );
					} );
				} );
			} );
		} );
		apiLoaded.then( function () {
			nextBatch( items );
		} );
	} );

} )( mediaWiki, wikibase, jQuery );
// </nowiki>