မီႇတီႇယႃႇဝီႇၶီႇ:Gadget-twinkleunlink.js

လုၵ်ႉတီႈ ဝီႇၶီႇပပ်ႉ မႃး
မၢႆတွင်း: ဝၢႆးသေသိမ်းပၼ်ယဝ်ႉ၊ တွၼ်ႈတႃႇ ၸဝ်ႈၵဝ်ႇ တေႁၼ်လႆႈ လွင်ႈလႅၵ်ႈလၢႆႈၼၼ်ႉ ၸဝ်ႈၵဝ်ႇတေၸၢင်ႈလႆႈလတ်းၶၢမ်ႈ ၶႅတ်ႉၶျ် တူဝ်ပိုတ်ႇဝႅပ်ႉၸဝ်ႈၵဝ်ႇယဝ်ႉ။
  • ၽွင်းမိူဝ်ႈတိုၵ်ႉၼဵၵ်း Reload တီႈ Firefox / Safari: ၼၼ်ႉ ၼဵၵ်းဝႆႉပႃး Shift ၊ဢမ်ႇၼၼ် ၼဵၵ်းပၼ် Ctrl-F5 ဢမ်ႇၼၼ် Ctrl-R (တီႈၼႂ်း Mac ၼႆ ၼဵၵ်းပၼ်⌘-R)
  • တီႈၼႂ်း Google Chrome: ၼဵၵ်းပၼ် Ctrl-Shift-R (တီႈၼႂ်း Mac ၼႆႉ ၼဵၵ်းပၼ်⌘-Shift-R )
  • ၽွင်းမိူဝ်ႈ တိုၵ်ႉၼဵၵ်း Refreshတီႈ Internet Explorer/ Edge: ၼဵၵ်းဝႆႉပၼ် Ctrl ဢမ်ႇၼၼ် ၼဵၵ်းပၼ် Ctrl-F5
  • တီႈၼႂ်း Opera: ၵႂႃႇၸူးတီႈ Menu → Settings (ပေႃးပဵၼ်တီႈၼႂ်း Mac ၸိုင် Opera → Preferences ) သေ သိုပ်ႇၵႂႃႇ Privacy & security → Clear browsing data → Cached images and files ၼၼ်ႉလႄႈ။
// If TwinkleConfig aint exist.
if ( window.TwinkleConfig == undefined ) {
	window.TwinkleConfig = {};
}

/**
 * TwinkleConfig.summaryAd (string)
 * If ad should be added or not to summary, default [[w:WP:TW|TW]]
 */
if ( TwinkleConfig.summaryAd == undefined ) {
	TwinkleConfig.summaryAd = " using [[w:WP:TW|TW]]";
}

/**
 * TwinkleConfig.unlinkNamespaces (array)
 * In what namespaces unlink should happen, default in 0 and 100
 */
if ( TwinkleConfig.unlinkNamespaces == undefined ) {
	TwinkleConfig.unlinkNamespaces = [0,100];
}

function twinkleunlink() {
	var tw;

	if ( mw.config.get('wgNamespaceNumber') < 0 ) {
		return;
	}

	tw = mw.util.addPortletLink( window.pTwinkle || "p-cactions", "#", "Unlink", "tw-unlink", "Unlink backlinks");
	$(tw).click( twinkleunlink.callback );
}

function getChecked2( nodelist ) {
	if ( !( nodelist instanceof NodeList ) && !( nodelist instanceof HTMLCollection ) ) {
		return nodelist.checked ? [ nodelist.value ] : [];
	}
	return $.map( nodelist, function(node) {
		if ( node.checked ) {
			return node.value;
		}
	});
}

twinkleunlink.callback = function twinklesunlinkCallback() {
	var Window = new SimpleWindow( 800, 400 ), form, query;

	Window.setTitle( "Unlink backlinks" );

	form = new QuickForm( twinkleunlink.callback.evaluate );
	form.append({
		type: 'textarea',
		name: 'reason',
		label: 'Reason: '
	});

	if ( mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').file ) {
		query = {
			'action': 'query',
			'list': [ 'backlinks', 'imageusage' ],
			'bltitle': mw.config.get('wgPageName'),
			'iutitle': mw.config.get('wgPageName'),
			'bllimit': userIsInGroup( 'sysop' ) ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
			'iulimit': userIsInGroup( 'sysop' ) ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
			'blnamespace': TwinkleConfig.unlinkNamespaces // Main namespace and portal namespace only, keep on talk pages.
		};
	} else {
		query = {
			'action': 'query',
			'list': 'backlinks',
			'bltitle': mw.config.get('wgPageName'),
			'blfilterredir': 'nonredirects',
			'bllimit': userIsInGroup( 'sysop' ) ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
			'blnamespace': TwinkleConfig.unlinkNamespaces // Main namespace and portal namespace only, keep on talk pages.
		};
	}

	var wikipedia_api = new Wikipedia.api( 'Grabbing backlinks', query, twinkleunlink.callbacks.display.backlinks );
	wikipedia_api.params = { form:form, Window:Window, image: mw.config.get('wgNamespaceNumber') == mw.config.get('wgNamespaceIds').file };
	wikipedia_api.post();

	var root = document.createElement( 'div' );
	Status.init( root );
	Window.setContent( root );
	Window.display();
};

twinkleunlink.callback.evaluate = function twinkleunlinkCallbackEvaluate(event) {
	mw.config.get('wgPageName') = mw.config.get('wgPageName').replace( /_/g, ' ' ); // for queen/king/whatever and country!

	var reason = event.target.reason.value;

	if ( event.target.backlinks ) {
		var backlinks = getChecked( event.target.backlinks );
	}
	if ( event.target.imageusage ) {
		var imageusage = getChecked( event.target.imageusage );
	}

	Status.init( event.target );

	if ( imageusage ) {
		var statusIndicator = new Status('Unlinking instances image', '0%');
		var total = imageusage.length * 2;

		var onsuccess = function( self ) {
			var obj = self.params.obj;
			var total = self.params.total;
			var now = parseInt( 100 * ++(self.params.current)/total ) + '%';
			obj.update( now );
			self.statelem.unlink();
			if( self.params.current >= total ) {
				obj.info( now + ' (completed)' );
				Wikipedia.removeCheckpoint();
			}
		}

		var onloaded = onsuccess;
		var onloading = function( self ) {}

		Wikipedia.addCheckpoint();

		if ( imageusage.length == 0 ) {
			statusIndicator.info( '100% (completed)' );
			Wikipedia.removeCheckpoint();
			return;
		}

		var params = { reason: reason, obj: statusIndicator, current: 0, total: total };

		for ( var i = 0; i < imageusage.length; ++i ) {
			var title = imageusage[i];
			var query = {
				'title': title,
				'action': 'submit'
			}
			var wikipedia_wiki = new Wikipedia.wiki( "Unlinking on " + title, query, twinkleunlink.callbacks.unlinkImageInstances );
			wikipedia_wiki.params = clone( params );
			wikipedia_wiki.params.title = title;
			wikipedia_wiki.onloading = onloading;
			wikipedia_wiki.onloaded = onloaded;
			wikipedia_wiki.onsuccess = onsuccess;
			wikipedia_wiki.get();
		}
	}

	if ( backlinks ) {
		var statusIndicator = new Status('Unlinking instances image', '0%');
		var total = backlinks.length * 2;

		var onsuccess = function( self ) {
			var obj = self.params.obj;
			var total = self.params.total;
			var now = parseInt( 100 * ++(self.params.current)/total ) + '%';
			obj.update( now );
			self.statelem.unlink();
			if( self.params.current >= total ) {
				obj.info( now + ' (completed)' );
				Wikipedia.removeCheckpoint();
			}
		}

		var onloaded = onsuccess;
		var onloading = function( self ) {}

		Wikipedia.addCheckpoint();

		if ( backlinks.length == 0 ) {
			statusIndicator.info( '100% (completed)' );
			Wikipedia.removeCheckpoint();
			return;
		}

		var params = { reason: reason, obj: statusIndicator, current: 0, total: total };

		for ( var i = 0; i < backlinks.length; ++i ) {
			var title = backlinks[i];
			var query = {
				'title': title,
				'action': 'submit'
			}
			var wikipedia_wiki = new Wikipedia.wiki( "Unlinking on " + title, query, twinkleunlink.callbacks.unlinkBacklinks );
			wikipedia_wiki.params = clone( params );
			wikipedia_wiki.params.title = title;
			wikipedia_wiki.onloading = onloading;
			wikipedia_wiki.onloaded = onloaded;
			wikipedia_wiki.onsuccess = onsuccess;
			wikipedia_wiki.get();
		}
	}
};

twinkleunlink.callbacks = {
	display: {
		backlinks: function( self ) {
			var xmlDoc = self.responseXML;
			if ( self.params.image ) {
				var imageusage = xmlDoc.evaluate('//query/imageusage/iu/@title', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
				var list = [];
				for ( var i = 0; i < imageusage.snapshotLength; ++i ) {
					var title = imageusage.snapshotItem(i).value;
					list.push( { label: title, value: title, checked: true } );
				}
				self.params.form.append({ type:'header', label:'Image usage' });
				self.params.form.append({ type:'checkbox', name:'imageusage', list: list });
			}

			var backlinks = xmlDoc.evaluate('//query/backlinks/bl/@title', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
			if ( backlinks.snapshotLength > 0 ) {
				var list = [];
				for ( var i = 0; i < backlinks.snapshotLength; ++i ) {
					var title = backlinks.snapshotItem(i).value;
					list.push( { label: title, value: title, checked: true } );
				}
				self.params.form.append({ type:'header', label:'Backlinks' });
				self.params.form.append({ type:'checkbox', name:'backlinks', list: list });
			}

			self.params.form.append( { type:'submit' } );

			var result = self.params.form.render();
			self.params.Window.setContent( result );
		}
	},

	unlinkBacklinks: function( self ) {
		var form = self.responseXML.getElementById('editform');
		var text = form.wpTextbox1.value;
		var old_text = text;
		var wikiPage = new Mediawiki.Page( text );
		wikiPage.removeLink( mw.config.get('wgPageName') );

		text = wikiPage.getText();
		if( text == old_text ) {
			// Nothing to do, return
			self.onsuccess( self );
			Wikipedia.actionCompleted( self );
			return;
		}
		var postData = {
			'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
			'wpWatchthis': undefined,
			'wpStarttime': form.wpStarttime.value,
			'wpEdittime': form.wpEdittime.value,
			'wpAutoSummary': form.wpAutoSummary.value,
			'wpEditToken': form.wpEditToken.value,
			'wpSection': '',
			'wpSummary': 'Removing backlinks to ' + mw.config.get('wgTitle') + " because \"" + self.params.reason.toUpperCaseFirstChar() + "\";" + TwinkleConfig.deletionSummaryAd,
			'wpTextbox1': text
		};
		self.post( postData );
	},
	unlinkImageInstances: function( self ) {
		var form = self.responseXML.getElementById('editform');
		var text = form.wpTextbox1.value;
		var old_text = text;
		var wikiPage = new Mediawiki.Page( text );
		wikiPage.commentOutImage( mw.config.get('wgTitle'), 'Commented out' );

		text = wikiPage.getText();
		if ( text === old_text ) {
			// Nothing to do, return
			self.onsuccess( self );
			Wikipedia.actionCompleted( self );
			return;
		}
		var postData = {
			'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
			'wpWatchthis': undefined,
			'wpStarttime': form.wpStarttime.value,
			'wpEdittime': form.wpEdittime.value,
			'wpAutoSummary': form.wpAutoSummary.value,
			'wpEditToken': form.wpEditToken.value,
			'wpSection': '',
			'wpSummary': 'Removing instances of image ' + mw.config.get('wgTitle') + " because \"" + self.params.reason.toUpperCaseFirstChar() + "\";" + TwinkleConfig.deletionSummaryAd,
			'wpTextbox1': text
		};
		self.post( postData );
	}
};

$(document).ready(twinkleunlink);