مدیاویکی:Gadget-twinkleunlink.js: تفاوت میان نسخه‌ها

از ایران پدیا
پرش به ناوبری پرش به جستجو
بدون خلاصۀ ویرایش
جز (۱ نسخه واردشده)
 
(۲ نسخهٔ میانیِ ایجادشده توسط همین کاربر نشان داده نشد)
خط ۹۲: خط ۹۲:
};
};
}
}
var wikipedia_api = new Morebits.wiki.api( 'در حال گرفتن پیوندهای برگشتی', query, Twinkle.unlink.callbacks.display.backlinks );
var iranpedia_api = new Morebits.wiki.api( 'در حال گرفتن پیوندهای برگشتی', query, Twinkle.unlink.callbacks.display.backlinks );
wikipedia_api.params = { form: form, Window: Window, image: mw.config.get('wgNamespaceNumber') === 6 };
iranpedia_api.params = { form: form, Window: Window, image: mw.config.get('wgNamespaceNumber') === 6 };
wikipedia_api.post();
iranpedia_api.post();


var root = document.createElement( 'div' );
var root = document.createElement( 'div' );
root.style.padding = '15px';  // just so it doesn't look broken
root.style.padding = '15px';  // just so it doesn't look broken
Morebits.status.init( root );
Morebits.status.init( root );
wikipedia_api.statelem.status( "در حال بارگیری..." );
iranpedia_api.statelem.status( "در حال بارگیری..." );
Window.setContent( root );
Window.setContent( root );
Window.display();
Window.display();
خط ۱۸۴: خط ۱۸۴:
namespaces = [];
namespaces = [];
$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
namespaces.push(Morebits.wikipedia.namespacesFriendly[v]);
namespaces.push(Morebits.iranpedia.namespacesFriendly[v]);
});
});
apiobj.params.form.append( {
apiobj.params.form.append( {
خط ۲۳۰: خط ۲۳۰:
namespaces = [];
namespaces = [];
$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
namespaces.push(Morebits.wikipedia.namespacesFriendly[v]);
namespaces.push(Morebits.iranpedia.namespacesFriendly[v]);
});
});
apiobj.params.form.append( {
apiobj.params.form.append( {

نسخهٔ کنونی تا ‏۲ دسامبر ۲۰۱۷، ساعت ۲۰:۵۲

//<nowiki>


(function($){


/*
 ****************************************
 *** twinkleunlink.js: Unlink module
 ****************************************
 * Mode of invocation:     Tab ("پیوندزدایی")
 * Active on:              Non-special pages
 * Config directives in:   TwinkleConfig
 */

Twinkle.unlink = function twinkleunlink() {
	if( mw.config.get('wgNamespaceNumber') < 0 ) {
		return;
	}
	Twinkle.addPortletLink( Twinkle.unlink.callback, "پیوندزدایی", "tw-unlink", "زدودن پیوندهای ورودی" );
};

Twinkle.unlink.getChecked2 = function twinkleunlinkGetChecked2( nodelist ) {
	if( !( nodelist instanceof NodeList ) && !( nodelist instanceof HTMLCollection ) ) {
		return nodelist.checked ? [ nodelist.values ] : [];
	}
	var result = [];
	for(var i  = 0; i < nodelist.length; ++i ) {
		if( nodelist[i].checked ) {
			result.push( nodelist[i].values );
		}
	}
	return result;
};

// the parameter is used when invoking unlink from admin speedy
Twinkle.unlink.callback = function(presetReason) {
	var Window = new Morebits.simpleWindow( 600, 440 );
	Window.setTitle( "زدودن پیوندهای ورودی" + (mw.config.get('wgNamespaceNumber') === 6 ? " و استفاده‌های پرونده" : "") );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "راهنمای توینکل", "WP:TW/DOC#unlink" );

	var form = new Morebits.quickForm( Twinkle.unlink.callback.evaluate );

	// prepend some basic documentation
	var node1 = Morebits.htmlNode("code", "[[" + Morebits.pageNameNorm + "|متن پیوند]]")
	var node2 = Morebits.htmlNode("code", "متن پیوند");
	node1.style.fontFamily = node2.style.fontFamily = "monospace";
	node1.style.fontStyle = node2.style.fontStyle = "normal";
	form.append( {
		type: 'div',
		style: 'margin-bottom: 0.5em',
		label: [ 
			'این ابزار به شما امکان پیوندزدایی همهٔ پیوندهای ورودی («پیوندهای برگشتی») را می‌دهد که به این صفحه اشاره می‌کنند' + 
				(mw.config.get('wgNamespaceNumber') === 6 ? "، یا همهٔ اجزای این پرونده با قراردادن آنها در علامت‌های توضیح <!-- --> پنهان می‌کند" : "") + 
				". برای نمونه، ",
			node1,
			" می‌شود ",
			node2,
			". با احتیاط از ابزار استفاده کنید."
		]
	} );

	form.append( {
		type: 'input',
		name: 'reason',
		label: 'دلیل: ',
		value: (presetReason ? presetReason : ''),
		size: 60
	} );

	var query;
	if(mw.config.get('wgNamespaceNumber') === 6) {  // File:
		query = {
			'action': 'query',
			'list': [ 'backlinks', 'imageusage' ],
			'bltitle': mw.config.get('wgPageName'),
			'iutitle': mw.config.get('wgPageName'),
			'bllimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
			'iulimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
			'blnamespace': Twinkle.getPref('unlinkNamespaces'),
			'iunamespace': Twinkle.getPref('unlinkNamespaces')
		};
	} else {
		query = {
			'action': 'query',
			'list': 'backlinks',
			'bltitle': mw.config.get('wgPageName'),
			'blfilterredir': 'nonredirects',
			'bllimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
			'blnamespace': Twinkle.getPref('unlinkNamespaces')
		};
	}
	var iranpedia_api = new Morebits.wiki.api( 'در حال گرفتن پیوندهای برگشتی', query, Twinkle.unlink.callbacks.display.backlinks );
	iranpedia_api.params = { form: form, Window: Window, image: mw.config.get('wgNamespaceNumber') === 6 };
	iranpedia_api.post();

	var root = document.createElement( 'div' );
	root.style.padding = '15px';  // just so it doesn't look broken
	Morebits.status.init( root );
	iranpedia_api.statelem.status( "در حال بارگیری..." );
	Window.setContent( root );
	Window.display();
};

Twinkle.unlink.callback.evaluate = function twinkleunlinkCallbackEvaluate(event) {
	Twinkle.unlink.backlinksdone = 0;
	Twinkle.unlink.imageusagedone = 0;

	function processunlink(pages, imageusage) {
		var statusIndicator = new Morebits.status((imageusage ? 'در حال پیوندزدایی نمونه‌های استفاده از پرونده' : 'در حال پیوندزدایی پیوندهای برگشتی'), '0%');
		var total = pages.length;  // removing doubling of this number - no apparent reason for it

		Morebits.wiki.addCheckpoint();

		if( !pages.length ) {
			statusIndicator.info( '100% (کامل شد)' );
			Morebits.wiki.removeCheckpoint();
			return;
		}

		// get an edit token
		var params = { reason: reason, imageusage: imageusage, globalstatus: statusIndicator, current: 0, total: total };
		for (var i = 0; i < pages.length; ++i)
		{
			var myparams = $.extend({}, params);
			var articlepage = new Morebits.wiki.page(pages[i], 'در حال پیوندزدایی در نوشتار «' + pages[i] + '»');
			articlepage.setCallbackParameters(myparams);
			articlepage.setBotEdit(true);  // unlink considered a floody operation
			articlepage.load(imageusage ? Twinkle.unlink.callbacks.unlinkImageInstances : Twinkle.unlink.callbacks.unlinkBacklinks);
		}
	}

	var reason = event.target.reason.value;
	if (!reason) {
		alert("شما باید دلیلی برای پیوندزدایی ارائه کنید.");
		return;
	}

	var backlinks, imageusage;
	if( event.target.backlinks ) {
		backlinks = Twinkle.unlink.getChecked2(event.target.backlinks);
	}
	if( event.target.imageusage ) {
		imageusage = Twinkle.unlink.getChecked2(event.target.imageusage);
	}

	Morebits.simpleWindow.setButtonsEnabled( false );
	Morebits.status.init( event.target );
	Morebits.wiki.addCheckpoint();
	if (backlinks) {
		processunlink(backlinks, false);
	}
	if (imageusage) {
		processunlink(imageusage, true);
	}
	Morebits.wiki.removeCheckpoint();
};

Twinkle.unlink.backlinksdone = 0;
Twinkle.unlink.imageusagedone = 0;

Twinkle.unlink.callbacks = {
	display: {
		backlinks: function twinkleunlinkCallbackDisplayBacklinks(apiobj) {
			var xmlDoc = apiobj.responseXML;
			var havecontent = false;
			var list, namespaces, i;

			if( apiobj.params.image ) {
				var imageusage = $(xmlDoc).find('query imageusage iu');
				list = [];
				for ( i = 0; i < imageusage.length; ++i ) {
					var usagetitle = imageusage[i].getAttribute('title');
					list.push( { label: usagetitle, value: usagetitle, checked: true } );
				}
				if (!list.length)
				{
					apiobj.params.form.append( { type: 'div', label: 'هیچ نمونهٔ استفاده از پرونده یافت نشد.' } );
				}
				else
				{
					apiobj.params.form.append( { type:'header', label: 'موارد کاربرد پرونده' } );
					namespaces = [];
					$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
						namespaces.push(Morebits.iranpedia.namespacesFriendly[v]);
					});
					apiobj.params.form.append( {
						type: 'div',
						label: "فضای نام انتخابی: " + namespaces.join(', '),
						tooltip: "شما می‌توانید این را از طریق ترجیحات توینکل‌تان در [[ایران‌پدیا:Twinkle/Preferences]] تغییر دهید."
					});
					if ($(xmlDoc).find('query-continue').length) {
						apiobj.params.form.append( {
							type: 'div',
							label: list.length.toString() + " استفادهٔ نخست از پرونده نشان داده شده‌است."
						});
					}
					apiobj.params.form.append({
						type: 'button',
						label: "انتخاب همه",
						event: function(e) {
							$(Morebits.quickForm.getElements(e.target.form, "imageusage")).prop('checked', true);
						}
					});
					apiobj.params.form.append({
						type: 'button',
						label: "عدم‌انتخاب همه",
						event: function(e) {
							$(Morebits.quickForm.getElements(e.target.form, "imageusage")).prop('checked', false);
						}
					});
					apiobj.params.form.append({
						type: 'checkbox',
						name: 'imageusage',
						list: list
					});
					havecontent = true;
				}
			}

			var backlinks = $(xmlDoc).find('query backlinks bl');
			if( backlinks.length > 0 ) {
				list = [];
				for ( i = 0; i < backlinks.length; ++i ) {
					var title = backlinks[i].getAttribute('title');
					list.push( { label: title, value: title, checked: true } );
				}
				apiobj.params.form.append( { type:'header', label: 'پیوندها به' } );
				namespaces = [];
				$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
					namespaces.push(Morebits.iranpedia.namespacesFriendly[v]);
				});
				apiobj.params.form.append( {
					type: 'div',
					label: "فضای نام انتخابی: " + namespaces.join(', '),
					tooltip: "شما می‌توانید این را از طریق ترجیحات توینکل‌تان در [[ایران‌پدیا:Twinkle/Preferences]] تغییر دهید."
				});
				if ($(xmlDoc).find('query-continue').length) {
					apiobj.params.form.append( {
						type: 'div',
						label: list.length.toString() + " پیوند برگشتی نخست نشان داده شده‌است."
					});
				}
				apiobj.params.form.append({
					type: 'button',
					label: "انتخاب همه",
						event: function(e) {
							$(Morebits.quickForm.getElements(e.target.form, "backlinks")).prop('checked', true);
						}
				});
				apiobj.params.form.append({
					type: 'button',
					label: "عدم‌انتخاب همه",
						event: function(e) {
							$(Morebits.quickForm.getElements(e.target.form, "backlinks")).prop('checked', false);
						}
				});
				apiobj.params.form.append({
					type: 'checkbox',
					name: 'backlinks',
					list: list
				});
				havecontent = true;
			}
			else
			{
				apiobj.params.form.append( { type: 'div', label: 'هیچ پیوند ورودی‌ای یافت نشد.' } );
			}

			if (havecontent) {
				apiobj.params.form.append( { type:'submit' } );
			}

			var result = apiobj.params.form.render();
			apiobj.params.Window.setContent( result );

			Morebits.checkboxShiftClickSupport($("input[name='imageusage']", result));
			Morebits.checkboxShiftClickSupport($("input[name='backlinks']", result));

		}
	},
	unlinkBacklinks: function twinkleunlinkCallbackUnlinkBacklinks(pageobj) {
		var text, oldtext;
		text = oldtext = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();

		var wikiPage = new Morebits.wikitext.page(text);
		wikiPage.removeLink(Morebits.pageNameNorm);
		text = wikiPage.getText();
		if (text === oldtext) {
			// Nothing to do, return
			Twinkle.unlink.callbacks.success(pageobj);
			Morebits.wiki.actionCompleted();
			return;
		}

		pageobj.setPageText(text);
		pageobj.setEditSummary("در حال حذف پیوند(ها) به «" + Morebits.pageNameNorm + "»: " + params.reason + "." + Twinkle.getPref('summaryAd'));
		pageobj.setCreateOption('nocreate');
		pageobj.save(Twinkle.unlink.callbacks.success);
	},
	unlinkImageInstances: function twinkleunlinkCallbackUnlinkImageInstances(pageobj) {
		var text, oldtext;
		text = oldtext = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();

		var wikiPage = new Morebits.wikitext.page(text);
		wikiPage.commentOutImage(mw.config.get('wgTitle'), 'توضیح شد');
		text = wikiPage.getText();
		if (text === oldtext) {
			// Nothing to do, return
			Twinkle.unlink.callbacks.success(pageobj);
			Morebits.wiki.actionCompleted();
			return;
		}

		pageobj.setPageText(text);
		pageobj.setEditSummary("در حال توضیح‌کردن استفاده(ها) از پرونده «" + Morebits.pageNameNorm + "»: " + params.reason + "." + Twinkle.getPref('summaryAd'));
		pageobj.setCreateOption('nocreate');
		pageobj.save(Twinkle.unlink.callbacks.success);
	},
	success: function twinkleunlinkCallbackSuccess(pageobj) {
		var params = pageobj.getCallbackParameters();
		var total = params.total;
		var now = parseInt( 100 * (params.imageusage ? ++(Twinkle.unlink.imageusagedone) : ++(Twinkle.unlink.backlinksdone))/total, 10 ) + '%';
		params.globalstatus.update( now );
		if((params.imageusage ? Twinkle.unlink.imageusagedone : Twinkle.unlink.backlinksdone) >= total) {
			params.globalstatus.info( now + ' (کامل شد)' );
			Morebits.wiki.removeCheckpoint();
		}
	}
};
})(jQuery);


//</nowiki>