MediaWiki:ExcerptTree.js

Catatan: Setelah menyimpan, Anda harus memintas tembolok (cache) peramban Anda untuk melihat perubahannya. Google Chrome, Firefox, Microsoft Edge dan Safari: Tahan tombol Shift dan klik Muat ulang (Reload) di tombol bilah alat. Untuk detail dan instruksi tentang peramban lain, lihat halaman menghapus singgahan (Inggris).

/**
 * ExcerptTree is a script to view and navigate excerpt trees in Wikipedia
 * Author/Maintainer: Sophivorus
 * Expected use will be via ?withJS links, so may not appear in what-links-here
 */
var ExcerptTree = {

	/**
	 * Initialization script
	 */
	init: function () {
		$( '.ExcerptTree' ).show();
		$( '.ExcerptTree li' ).each( ExcerptTree.addChildren );
	},

	addChildren: function () {
		var node = $( this ),
			title = $( node ).children( 'a' ).text();
		ExcerptTree.getChildren( title ).done( function ( data ) {
			var page = data.query.pages[0],
				children = page.templates;
			if ( children ) {
				children = children.map( function ( x ) { return x.title } );
				children = children.filter( function ( x ) { return x !== title } );
				if ( page.redirects ) {
					children = children.filter( function ( x ) {
						return page.redirects.map( function ( x ) {
							return x.title;
						} ).indexOf( x ) == -1;
					} );
				}
				if ( children.length ) {
					ExcerptTree.addButton( node );
					var list = $( '<ul>' ).hide().data( 'virgin', true );
					children.forEach( function ( title ) {
						var link = $( '<a>', { 'href': mw.util.getUrl( title ), 'title': title } ).text( title ),
							item = $( '<li>' ).html( link );
						list.append( item );
					});
					node.append( list );
				}
			}
		});
	},

	/**
	 * Add a clickable right-arrow to the given node
	 */
	addButton: function ( node ) {
		var button = $( '<span>' ).text( '►' ).css({
			'cursor': 'pointer',
			'position': 'absolute',
			'left': '-1em'
		});
		node.css({
			'list-style': 'none',
			'position': 'relative'
		}).prepend( button );
		button.click( node, ExcerptTree.toggleChildren );
	},

	toggleChildren: function ( event ) {
		var node = event.data,
			button = $( node ).children( 'span' ),
			list = $( node ).children( 'ul' ),
			virgin = list.data( 'virgin' );

		list.toggle();
		if ( virgin ) {
			list.data( 'virgin', false );
			list.children( 'li' ).each( ExcerptTree.addChildren );
			button.text( '▼' );
		} else {
			if ( list.is( ':visible' ) ) {
				button.text( '▼' );
			} else {
				button.text( '►' );
			}
		}
	},

	getChildren: function ( title ) {
		var api = new mw.Api();
		return api.get({
			titles: title,
			action: 'query',
			formatversion: 2,
			prop: 'templates|redirects',
			rdlimit: 'max',
			tllimit: 'max',
			tlnamespace: '0'
		});
	}
};

mw.loader.using( 'mediawiki.api', ExcerptTree.init );