Wikipedysta:Peter Bowman/highlight-stubs.js

Z Wikipedii, wolnej encyklopedii

Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.

  • Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
  • Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
  • Internet Explorer / Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5
  • Opera: Naciśnij klawisze Ctrl+F5.
/**
 * Zaznacza innym kolorem linki do stubów. Domyślnie przyjmuje 500 bajtów jako
 * maksymalny rozmiar strony kwalifikującej się jako stub. Tę wartosć można
 * dostosować, ustawiając zmienną `stubThreshold` przed wywołaniem skryptu:
 *
 *   // w [[Specjalna:Moja strona/common.js]]:
 *   window.stubThreshold = 1000;
 *   importScript( 'User:Peter Bowman/highlight-stubs.js' );
 *
 * Autor: [[User:Peter Bowman]].
 * Opracowano na podstawie [[wikt:MediaWiki:Gadget-false-blue-links.js]].
 */

if ( mw.config.get( 'wgAction' ) === 'view' && mw.config.get( 'wgNamespaceNumber' ) >= 0 ) {
	mw.loader.using( [ 'mediawiki.util', 'mediawiki.api' ] ).done( function () {
		var api = new mw.Api(),
			cache = {},
			pathPrefix = mw.format( mw.config.get( 'wgArticlePath' ), '' ),
			ignoredClasses = [
				'.new',
				'.extiw',
				'.external',
				'.internal',
				'.image',
				'.mw-redirect'
			].join( ',' ),
			selector = mw.format( 'a[href^="$1"]:not($2)', pathPrefix, ignoredClasses ),
			query = {
				formatversion: 2,
				titles: mw.config.get( 'wgPageName' ),
				prop: 'info',
				generator: 'links',
				gpllimit: 'max',
				gplnamespace: 0
			},
			threshold = Number( window.stubThreshold ) || 500;
		
		function makeRequest( query, cont ) {
			var apiPromise = api.get( $.extend( query, cont ) );
			
			return apiPromise.then( function ( data ) {
				( data.query && data.query.pages || [] ).filter( function ( obj ) {
					return 'length' in obj;
				} ).forEach( function ( obj ) {
					cache[ obj.title ] = obj.length;
				} );
				
				if ( data[ 'continue' ] ) {
					return makeRequest( query, data[ 'continue' ] );
				} else {
					return undefined;
				}
			} ).promise( {
				abort: apiPromise.abort
			} );
		}
		
		mw.util.addCSS( '.stub { color: #723; }' ); // [[phab:T284917]]
		
		mw.hook( 'wikipage.content' ).add( function ( $content ) {
			makeRequest( query ).done( function () {
				if ( Object.keys( cache ).length ) {
					$content
						.find( selector )
						.filter( function () {
							var href = this.getAttribute( 'href' ),
								title = decodeURI( href.replace( pathPrefix, '' ).replace( /_/g, ' ' ) );
							
							return title in cache && cache[ title ] <= threshold;
						} )
						.addClass( 'stub' );
				}
			} );
		} );
	} );
}