ذريعات وڪي:TourwikiConsole.js

کليل ڄاڻ چيڪلي، وڪيپيڊيا مان

تفصيل جي لاءِ ڪلڪ ڪريويادگيري: محفوظ ڪرڻ کانپوءِ تازين تبديلن کي کي ڏسڻ جي لاءِ توهان کي پنهنجي برائوزر جي ڪيش کي صاف ڪرڻ جي ضرورت آهي.

  • فائرفاڪس: جڏهن Reload تي ڪلڪ ڪريو ته Shift دٻائي رکو یا Ctrl-F5 یا Ctrl-R دٻايو (Mac تي R-⌘)
  • گوگل ڪروم: Ctrl-Shift-R دٻايو (Mac تي Shift-R-⌘)
  • انٽرنيٽ ايڪسپلورر: جڏهن Refresh تي ڪلڪ ڪريو ته Ctrl یا Ctrl-F5 دٻايو
  • اوپيرا: Tools → Preferences ۾ وڃو ۽ ڪيش صاف ڪريو
دستاويز[تخليق]
$(function () {
	'use strict';
	
	document.title = 'اجتماعي تخليق ڪاري - کليل ڄاڻ چيڪلو، وڪيپيڊيا';
	
	if (mw.config.get('wgCanonicalSpecialPageName') !== 'Blankpage' ||
			mw.config.get('wgPageName').split('/')[1] !== 'tourwiki-conosle') {
		return;
	}
	
	if (mw.config.get('wgUserGroups').every(function (x) {
			return ['bot', 'autopatrolled', 'patroller', 'sysop', 'eliminator'].indexOf(x) === -1;
		})) {
		$('#content').empty().append('معذرت، هن سهولت کي مخصوص واپرائيندڙ استعمال ڪري سگھن ٿا۔');
		return;
	}

	window.onbeforeunload = function () {
		if ($('#tourwiki-main').width() && $('#tourwiki-main').val() === '') {
			return;
		}
		return 'تڪميل کان اڳ هي صفحو بند نه ڪيو';
	};
	
	var methods = {
		city: {
			title: 'شهر ۽ وڏا شهر رهائش',
			summary: 'Rezabot',
			generateContent: function (request) {
				return $.getJSON(new mw.Uri('//tools.wmflabs.org/rezabot/a.php').extend({
					sdwiki: request[0],
					enwiki: request[1]
				}));
			},
			extraInfo: $('<div>').append(
				'<div>در پنجرهٔ پایین نام فارسی و انگلیسی مقالهٔ ناموجود را بنویسید و دکمهٔ درخواست را بزنید. بعد از چند دقیقه ربات متن مقاله و پیش‌نمایش آنرا در اختیارتان می‌گذارد. بعد از اعمال تغییرات دکمهٔ ایجاد را بزنید. مانند:</div>',
				'<br><div>شیراز@Shiraz</div>',
				'<br><div>تهران@Tehran</div>',
				'<br><div>اصفهان@Isfahan</div>',
				'<br>شهرهای ناموجود مهم در ',
				'<b><a href="//fa.wikipedia.org/wiki/ویکی‌پدیا:گزارش_دیتابیس/شهرهای_ناموجود" target="_blank">اینجا</a></b>',
				' فهرست شده‌اند؛ با کلیک بر روی موضوع مقاله می‌توانید مقالات شهرها را مشاهده کنید.<br>'
			),
			placeholder: 'عنوان @ Title',
			enableCheckButton: true,
			enableFirstAidsButton: true
		},

		general: {
			title: 'اشخاص، آرایه‌های زیستی، فیلم، موسیقی، رود، ساختمان و بازی‌های ویدئویی',
			summary: 'Dexbot',
			generateContent: function (request) {
				return $.getJSON('//tourwiki.wmflabs.org/translate/enwiki/' + request[1] + '/' + request[0]);
			},
			extraInfo: $('<div>').append(
				'<div>در پنجرهٔ پایین نام فارسی و انگلیسی مقالهٔ ناموجود را بنویسید و دکمهٔ درخواست را بزنید. بعد از چند دقیقه ربات متن مقاله و پیش‌نمایش آنرا در اختیارتان می‌گذارد. بعد از اعمال تغییرات دکمهٔ ایجاد را بزنید.</div>',
				'<br>مقاله‌های ناموجود مهم در ',
				'<b><a href="//fa.wikipedia.org/wiki/ویکی‌پدیا:گزارش_دیتابیس/مقاله‌های_مهم_ایجادنشده" target="_blank">اینجا</a></b>',
				' فهرست شده‌اند؛ با کلیک بر روی موضوع مقاله می‌توانید برپایهٔ موضوع آنها را مرتب و انتخاب کنید.<br>'
			),
			placeholder: 'عنوان @ Title',
			enableCheckButton: true,
			enableFirstAidsButton: true
		},
		
		redirect: {
			title: 'چورڻا',
			summary: 'فهرست',
			generateContent: function (request) {
				return $.Deferred().resolve({
					page_content: '#' + 'چورڻا [' + '[' + request[1] + ']]'
				});
			},
			noLanguageLinks: true,
			extraInfo: '',
			placeholder: 'عنوان @ عنوان ٻيو',
			creationExtraTool: function () {
				var destination = location.hash.split('|')[1];

				if (!destination)
					return;

				destination = decodeURI(destination);
				
				var ns = 0;
				
				var pageNameParts = destination.split(/:/);
				if (pageNameParts.length > 1) {
					var possibleNs = mw.config.get('wgNamespaceIds')[pageNameParts[0]];

					if (possibleNs !== undefined) {
						ns = possibleNs;
						destination = pageNameParts.slice(1).join(':');
					}
				}
				
				var namespaces = {
					0: '',
					2: 'واپرائيندڙ:',
					4: ['وپ:', 'وڪيپيڊيا:'],
					6: 'فائل:',
					8: 'ذريعات وڪي:',
					10: 'سانچو:',
					12: 'مدد:',
					14: 'زمرو:',
					100: 'باب:',
					102: 'ڪتاب:',
					828: 'ماڊيول:'
				};
		
				var append = '@';
				var buttonText = '@';
				if (typeof namespaces[ns] === 'object') {
					append = namespaces[ns][0] + '@' + namespaces[ns][1] + destination;
					buttonText = namespaces[ns][0] + '@پويون صفحو';
				} else if (typeof namespaces[ns] === 'string') {
					append = namespaces[ns] + '@' + namespaces[ns] + destination;
					buttonText = namespaces[ns] + '@' + destination;
				}

				return $('<span>', {
					text: buttonText,
					class: 'mw-ui-button mw-ui-constructive'
				}).click(function () {
					var value = $('#tourwiki-main').val().trim();
					if (value !== '')
						value = value + '\n';
					value = value + append;
					$('#tourwiki-main').val(value).focus();
				});
			},
			editBoxRows: 2,
			previewHeight: 60,
			autoCreate: true
		},

		category: {
			title: 'زمرا',
			summary: 'فهرست',
			generateContent: function (request) {
				var enlink = request[1].replace(/\_/g, ' ');
				return $.post('//tools.wmflabs.org/linkstranslator/', { p: enlink }).then(function (result) {
					if (Object.keys(result).length) {
						return $.Deferred().reject('مساوی صفحو اڳ موجود آهي');
					}
					return catParents(enlink);
				}).then(function (parents) {
					if (!parents) {
						return $.Deferred().reject('پیش نظر صفحو بعنوان "' + enlink + '" سنڌي وڪيپيڊيا تي موجود ناهي، ان لاءِ اوهان هي صفحو تخليق ڪري سگھو ٿا!');
					}
					return $.post('//tools.wmflabs.org/linkstranslator/', {
						p: parents.join('|')
					});
				}).then(function (translatedParents) {
					return getWikidataEntity(enlink).then(function (entity) {
						var text = Object.keys(translatedParents).map(function (x) {
							return translatedParents[x];
						}).sort(function (x, y) {
							var keyX = dePersian(x),
								keyY = dePersian(y);
							if (keyX < keyY) { return -1; }
							if (keyX > keyY) { return 1; }
							return 0;
						}).map(function (x) {
							return '[[' + x + ']]';
						}).join('\n') + '\n\n[' + '[en:' + enlink + ']]';

						if (entity.claims && entity.claims.P373)
							text = '{' + '{زمرو ڪامنز}}\n' + text;
						if (entity.claims && entity.claims.P301)
							text = '{' + '{اصل مضمون}}\n' + text;

						return { page_content: text };
					});
				});
			},
			afterSaveAction: function (pageTitle) {
				var defer = $.Deferred();
				var status = $('<span>', { text: 'درخواست ' + pageTitle + '…' });
				mw.notify(status, { autoHide: false });
				setTimeout(function () {
					return $.get('//tools.wmflabs.org/zumraband/zzumra.php', {
						title: pageTitle,
						sdwiki: pageTitle.replace(/ /g, '_'),
						user: 'واپرائيندڙ:' + mw.config.get('wgUserName'),
						namespace: 14
					}).then(function () {
						status.text('درخواست ' + pageTitle + ' مڪمل ٿي۔');
						defer.resolve();
					}, defer.resolve);
				}, 2000);
				return defer;
			},
			extraInfo: $('<div>').append(
				'ززمرو تخليق ڪرڻ لاءِ هيٺِان مثال ڏسو:' +
				'<br>زمرو1@Cateogry1<br>زمرو2@Cateogry2<br>زمرو3@Cateogry3<br><b>اهم نقطا:</b><ol>' +
				'<li>نوان تخليق ڪيل زمرا ڪجه ڪلاڪن بعد وڪيپيڊيا:روبوٽ جي مدد سان وڪيپيڊيا:وڪي ڊيٽا سان ڳنڊجي ويندا، ان کان پوءِ ٻين خودڪار ذريعن سان انهن کي صفحن تي لڳايو ويندو؛ جيڪڏهن اوهان چاهيو ته پاڻ ئي انهن کي وڪي ڊيٽا سان ڳنڍي سگھو ٿا ۽ انهن کي صفحن تي استعمال ڪري سگھو ٿا۔' +
				'<li> جيڪي زمرا انگريزي وڪي تي موجود ناهي اهي نٿا جوڙي سگھجن۔<br>' +
				'</ol>'
			),
			placeholder: 'زمري جو سنڌي عنوان @ Title',
			editBoxRows: 7,
			previewHeight: 60
		},

		disambig: {
			title: 'سلجهائپ صفحا',
			summary: 'Shuaib-bot',
			generateContent: function (request) {
				return $.getJSON(new mw.Uri('//tools.wmflabs.org/shuaib-bot/disambig.php').extend({
					sdwiki: request[0],
					enwiki: request[1]
				}));
			},
			extraInfo: $('<div>').append(
				'<div>هيٺ انگريزي ۽ اردو عنوان داخل ڪري درخواست تي ڪلڪ ڪيو، ڪجهه دير کان پوءِ درخواست ڪيل صفحا نظر ايندا جنهن تي نظرثاني ڪرڻ بعد اوهان تخليق ڪري سگھو ٿا. درخواست ڏيڻ جو طريقو هيٺ ڏنل آهي:</div>',
				'<br><div>ناگپور@Nagpur</div>',
				'<br><div>ممبئي@Mumbai</div>',
				'<br><div>دهلي@Delhi</div>'
			),
			placeholder: 'عنوان @ Title',
			enableCheckButton: true,
			enableFirstAidsButton: true
		},

		custom: {
			title: 'شخصی',
			summary: 'شخصي سانچو',
			generateContent: function (request) {
				return $.Deferred().resolve({
					page_content: '{{جا:' + $('#tourwiki-customtemplate').val() + '|' + request.map(function (x, i) {
						return (i + 1) + '=' + x;
					}).join('|') + '}}'
				});
			},
			afterSaveUtils: function (pageTitle) {
				return $('<button>', { style: 'font-size: 100%' }).text('اضافي سانچن ۽ تصويرن لاءِ درخواست').click(function () {
					var button = $(this);
					button.text('جاري۔۔۔').attr('disabled', '');
					
					$.get('//tools.wmflabs.org/khanamalumat/khanamalumat.php', {
						title: pageTitle,
						sdwiki: pageTitle.replace(/ /g,'_'),
						user: 'واپرائيندڙ:' + mw.config.get('wgUserName'),
						namespace: 0
					}).then(function(result) {
						return $.get('//tools.wmflabs.org/zumraband/zumra.php', {
							title: pageTitle,
							sdwiki: pageTitle.replace(/ /g,'_'),
							user: 'واپرائيندڙ:' + mw.config.get('wgUserName'),
							namespace: 0
						});
					}).then(function () {
						button.text('مڪمل');
					});
				});
			},
			extraInfo: $('<div>').append(
				'راهنمای <b><a href="//fa.wikipedia.org/wiki/راهنما:ساخت_مقاله_به_کمک_الگوی_شخصی_با_ابزار_به_ویکی‌فا_انبوه" target="_blank">ساخت مقاله به کمک الگوی شخصی با ابزار به ویکی‌فا انبوه</a></b> اطلاعات بسیار خوبی رابطه جهت استفاده از این قسمت می‌دهد.<br><br>',
				'به طور خلاصه برای استفاده از این ابزار کافی‌ست فایل اکسل را در جعبهٔ زیر کپی کنید و الگوی تراگنجایش را مشخص کنید.',
				'<br>',
				'<b>نکته:</b> متغیر۱ برابر با نام مقاله و متغیر۲ برابر با میان‌ویکی‌ست و سایر متغیرها هم برای معرفی بخش‌های تغییرپذیر مقاله کاربرد دارند.'
			),
			placeholder: 'متغیر۱ (نام مقاله)\tمتغیر۲ (ترجیحاً عنوان انگلیسی)\tمتغیر۳\tمتغیر۴\t…',
			enableCheckButton: true,
			enableFirstAidsButton: true
		}
	};
	
	// ابزارهای رده
	function catParents(title) {
		return new mw.Api({ ajax: { url: '//en.wikipedia.org/w/api.php' } }).get({
			action: 'query',
			prop: 'categories',
			titles: title,
			clshow: '!hidden',
			cllimit: 500,
			format: 'json',
			origin: window.location.protocol + '//' + window.location.hostname
		}).then(function (data) {
			return (data.query.pages[Object.keys(data.query.pages)[0]].categories || []).map(function (x) { return x.title; });
		});
	}
	
	function getWikidataEntity(entitle) {
		return new mw.Api({ ajax: { url: '//www.wikidata.org/w/api.php' } }).get({
			action: 'wbgetentities',
			format: 'json',
			sites: 'enwiki',
			titles: entitle,
			normalize: 'true',
			origin: window.location.protocol + '//' + window.location.hostname
		}).then(function (x) { return x.entities[Object.keys(x.entities)[0]]; });
	}

	function pageExists(page) {
		return new mw.Api({ ajax: { url: '//sd.wikipedia.org/w/api.php' } }).get({
			action: 'query',
			titles: page,
			format: 'json'
		}).then(function (data) { return data.query.pages['-1'] === undefined; });
	}
	
	function dePersian(text) {
		return text
			.replace(/ی/g, 'ی')
			.replace(/ک/g, 'ک')
			.replace(/گ/g, 'گ')
			.replace(/ژ/g, 'ژ')
			.replace(/چ/g, 'چ')
			.replace(/پ/g, 'پ');
	}
	////
	
	$('#content').empty().append($('<div>', { id: 'tourwiki-console' }).css({
		border: '2px solid #b3000b',
		padding: '1em',
		'background-color': '#fefce3',
		'margin-bottom': '8px',
		'border-radius': '15px'
	}).append($('<div>', { id: 'tourwiki-console-input' }).append(
		'نوع: ',
		$('<select>', { id: 'tourwiki-select', style: 'font-size: 120%' }).append(Object.keys(methods).map(function (id) {
			return $('<option>', { value: id }).text(methods[id].title);
		})).change(function () {
			if ($(this).val() === 'custom') {
				$('#tourwiki-custom').show();
				$('#tourwiki-delimiter').val('\t');
			} else {
				$('#tourwiki-custom').hide();
				$('#tourwiki-delimiter').val('@');
			}
			
			var method = methods[$(this).val()];
			$('#tourwiki-extrainfo').empty().append(method.extraInfo);
			$('#tourwiki-main').attr('placeholder', method.placeholder);
			$('#tourwiki-creationextratool').empty().append(method.creationExtraTool
				? method.creationExtraTool()
				: '');
			$('#tourwiki-checkbutton').toggle(method.enableCheckButton);
			$('#tourwiki-firstaidsbutton').toggle(method.enableFirstAidsButton);
		}),
		'<br>',
		'جدا کنندہ&nbsp;',
		$('<select>', { id: 'tourwiki-delimiter' }).append(
			$('<option>', { value: '@' }).text('@'),
			$('<option>', { value: '|' }).text('|'),
			$('<option>', { value: '\t' }).text('ٽيب')
		),
		'<br>',
		$('<div>', { id: 'tourwiki-custom' }).append(
			'الگو برای تراگنجایش: ',
			$('<input>', { id: 'tourwiki-customtemplate' })
		).hide(),
		'<br>',
		$('<div>', { id: 'tourwiki-extrainfo' }),
		'<br>',
		$('<div>', { id: 'tourwiki-creationextratool' }).css({ position: 'absolute', left: '2.5em' }),
		$('<textarea>', {
			id: 'tourwiki-main',
			style: 'font-size: 150%',
			rows: 10
		}),
		$('<button>', { style: 'font-size: 100%', text: 'درخواست' }).click(function () {
			var method = methods[$('#tourwiki-select').val()];
			var delimiter = $('#tourwiki-delimiter').val();

			var requests = resolveUserRequests(delimiter);
			$('#tourwiki-console-input').hide();
			$('#tourwiki-console').append(
				$('<div>', { id: 'tourwiki-progress' }),
				'<br><hr><br>'
			);
			var current = 1;
			var success = 0;
			requests.map(function (request) {
				var row = $('<div>', {
					'class': 'tourwiki-row',
					style: 'border-bottom: 1px solid; margin-bottom: 1em; padding-bottom:1em;'
				}).appendTo('#tourwiki-console');
				return function generateText() {
					var sdwiki = request[0].replace(/ي/g, 'ي').replace(/ڪ/g, 'ک');
					var enwiki = request[1];
					
					var promise = method.generateContent(request).then(function (result) {
						return result.error
							? $.Deferred().reject(result.error)
							: preSavedTransform(result.page_content, sdwiki);
					});

					$('#tourwiki-progress').text('ڳولا جاري «' sdwiki
						+ '» (' + (current++).toLocaleString('sd') + ' از ' +
						requests.length.toLocaleString('sd') + ')');

					return promise.then(function (content) {
						if (window.persianWikiTools) {
							content = persianWikiTools.superTool(content);
						}
						var textarea = $('<textarea>', { cols: 80, rows: method.editBoxRows || 20, text: content });
						var summary = $('<input>', { style: 'width: 500px;' })
							.val('تخليق بذريعه اجتماعي تخلق ' + method.summary + 'خودڪار');
						var previewElement = $('<div>', { 'class': 'tourwiki-preview' });
						var preview = function () {
							return parseContent(textarea.val(), sdwiki).then(function (result) {
								previewElement.css({
									'border': '1px solid grey',
									'padding': '1em',
									'height': method.previewHeight || 270,
									'overflow-y': 'scroll'
								}).html(result).append('<div style="clear: both">');
							});
						};
						preview();
						var againInput = $('<input>').val(request.join(delimiter));
						
						row.empty().append(
							$('<div>', { style: 'font-size: 150%;' }).text(sdwiki),
							textarea,
							'<br>',
							summary,
							'<br><br>',
							previewElement,
							'<br>',
							$('<button>', { style: 'font-size: 100%', 'class': 'tourwiki-row-create-button', text: 'تخلیق' }).click(function () {
								var content = textarea.val();
								var summaryText = summary.val();
								row.empty().append('تخلیق جاري ' + sdwiki + '۔۔۔');
								createPage(sdwiki, content, summaryText).then(function () {
									pageExists(sdwiki).then(function (exists) {
										if (!exists) {
											row.empty().append(
												'«', $('<a>', { text: sdwiki, target: '_blank', href: mw.util.getUrl(sdwiki) }), '» به دلیل خطا ایجاد نشد! (ممکن است خطای پالایه باشد)',
												method.afterSaveUtils ? method.afterSaveUtils(sdwiki) : ''
											);
										} else {
											row.empty().append(
												'«', $('<a>', { text: sdwiki, target: '_blank', href: mw.util.getUrl(sdwiki) }), '»مڪمل ',
												method.afterSaveUtils ? method.afterSaveUtils(sdwiki) : ''
											);
										}
									})
									if (++success === requests.length) {
										window.onbeforeunload = undefined;
									}
									if (method.noLanguageLinks)
										return;

									return $.when(wikidataToken(), getWikidataId(enwiki)).then(function (token, id) {
										return addWikidataSitelink(token, id, sdwiki, 'sdwiki');
									}).then(undefined, function () { return $.Deferred().resolve(); }).then(function () {
										return $.get('//tools.wmflabs.org/shuaib-bot/interwikidata.php', { page: sdwiki });
									}).then(undefined, function () { return $.Deferred().resolve(); }).then(function () {
										if (method.afterSaveAction) return method.afterSaveAction(sdwiki);
									});
								}, function (error) {
									var retryInput = $('<input>').val(request.join(delimiter));
									row.empty().append(
										$('<span>', {
											style: 'color: red;',
											text: error === 'articleexists'
												? 'هن عنوان سان سنڌي وڪيپيڊيا تي عنوان موجود آهي'
												: error
										}),
										'<br>',
										retryInput,
										$('<button>').text('اٻيهر ڳولا').click(function () {
											request = retryInput.val().split(delimiter);
											row.empty().html('ٻيهر ڳولا جاري۔۔۔');
											generateText();
										})
									);
								});
							}),
							' ',
							$('<button>').css('font-size', '100%').text('پيش نگھاه').click(function () {
								var button = $(this);
								button.attr('disabled', '');
								preview().then(function () {
									button.prop('disabled', false);
								});
							}),
							' ',
							window.persianWikiTools ? $('<img>', {
								src: '//upload.wikimedia.org/wikipedia/fa/f/fc/Button_super_tool.png'
							}).click(function () {
								textarea.val(persianWikiTools.superTool(textarea.val()));
							}) : '',
							'<br><br>',
							againInput,
							$('<button>').text('تهیه مجدد').click(function () {
								request = againInput.val().split(delimiter);
								row.empty().html('تهیه مجدد…');
								generateText();
							})
						);
					}).then(undefined, function (error) {
						error = error || 'تخلیق ' + sdwiki + ' نامڪمل';
						parseContent(error).then(function (parsedError) {
							var retryInput = $('<input>').val(request.join(delimiter));
							row.empty().append(
								$('<span>', {
									style: 'color: red;',
									html: parsedError
								}),
								retryInput,
								$('<button>').text('از سر نو تلاش').click(function () {
									request = retryInput.val().split(delimiter);
									row.empty().html('ٻيهر ڳولا جاري۔۔۔');
									generateText();
								})
							);
						});
						return $.Deferred().resolve();
					});
				};
			}).reduce(function (defer, job) {
				return defer.then(job);
			}, $.Deferred().resolve()).then(function () {
				$('#tourwiki-progress').empty();
				
				function createAll() {
					var createAllButton = $('#tourwiki-createallbutton');
					createAllButton.prop('disabled', 'disabled');
					$('.tourwiki-row-create-button').get().map(function (button) {
						return function () {
							$(button).click();
							var defer = $.Deferred();
							setTimeout(defer.resolve, 1000);
							return defer;
						};
					}).reduce(function (defer, job) {
						return defer.then(job);
					}, $.Deferred().resolve()).then(function () {
						createAllButton.hide();
					});
				}
				
				if (mw.config.get('wgUserGroups').indexOf('bot') !== -1) {
					$('#tourwiki-progress').append($('<button>', {
						id: 'tourwiki-createallbutton',
						text: 'اجتماعي تخلیق'
					}).click(createAll));
				}
				if (method.autoCreate) {
					createAll();
				}
				$('#tourwiki-console').append('<brاصل درخواستون: ', $('<div>', {
					style: 'margin: 1em; padding: 0.4em; border: 1px dotted; white-space: pre-wrap;',
					html: requests.map(function (x) { return x.join(delimiter); }).join('<br>')
				}));
			});
		}),
		' ',
		$('<button>', { style: 'font-size: 100%', id: 'tourwiki-checkbutton', text: 'جانچ' }).click(function () {
			var delimiter = $('#tourwiki-delimiter').val();
			var requests = resolveUserRequests(delimiter);
			if (requests.some(function (x) { return x.length !== requests[0].length; })) {
				mw.notify('❌ اندازه‌های ورودی‌ها در خطوط مختلف یکسان نیست! احتمالاً اشتباهی در ورودی وجود دارد.', { autoHide: false });
			}
			var button = $(this);
			button.text('جاري۔۔۔');
			$.post('//tools.wmflabs.org/linkstranslator/', {
				from: 'sd',
				to: 'sd',
				p: requests.map(function (x) { return x[0]; }).join('|')
			}).then(function (faPages) {
				faPages = Object.keys(faPages);
				$.post('//tools.wmflabs.org/linkstranslator/', {
					from: 'en',
					to: 'sd',
					p: requests.map(function (x) { return x[1]; }).join('|')
				}).then(function (enFaEqus) {
					button.text('جانچيو');
					//mw.notify('✔️ جانچ مڪمل ٿي!', { autoHide: false });
					mw.notify('تعداد متغییرهای ورودی '+requests[0].length.toString()+' است، مطمئن شوید که الگو تراگنجایش هم همین تعداد متغییر دارد.', { autoHide: false });
					enFaEqus = Object.keys(enFaEqus);
					$('#tourwiki-main').val(requests.map(function (x) {
						if (faPages.indexOf(x[0]) !== -1) {
							x[0] = 'خلل: صفحو موجود > ' + x[0];
						}
						if (enFaEqus.indexOf(x[1]) !== -1) {
							x[1] = 'خلل: ترجمو موجود > ' + x[1];
						}
						return x.join(delimiter);
					}).join('\n'));
				});
			});
		}),
		' ',
		window.persianWikiTools ? $('<img>', {
			src: '//upload.wikimedia.org/wikipedia/fa/f/fc/Button_super_tool.png'
		}).click(function () {
			$('#tourwiki-main').val(persianWikiTools.superToolMove($('#tourwiki-main').val()));
		}) : '',
		' ',
		$('<button>', {
			id: 'tourwiki-firstaidsbutton',
			text: 'اصلاح‌های اولیه ربات استخراج',
			style: 'font-size: 40%'
		}).click(function () {
			$('#tourwiki-main').val($('#tourwiki-main').val().split('\n').map(function (x) {
				var r = x.split('\t');
				if (!r[1]) return '';
				var row = r[1].trim().replace(/^en:/, '').replace(/\)$/, '').split('(⎘');
				if (!row[1]) return '';
				row[1] = persianWikiTools.superToolMove(row[1]
					.replace(/ي/g, 'ي').replace(/ك/g, 'ڪ').replace(/ة/g, 'ه')
					.replace(/^en:/, '').replace(/أ/g, 'ا').replace(/اء/g, 'ا')
					.replace(/إ/g, 'ا')
					.replace(/عبدال/g, 'عبد ال')
					.replace(/([ \(\)])لاعب([ \(\)])/g, '$1کلاڙي2')
					.replace(/([ \(\)])كرة قدم([ \(\)])/g, '$1فٽ بال$2')
					.replace(/([ \(\)])موالید([ \(\)])/g, '$1پیدائشون$2'));
				return row.reverse().join('@') + '\n';
			}).join(''));
		})
	)));
	
	function onHashChange() {
		if (location.hash === '#catmaker') {
			$('#tourwiki-select').val('category');
		}
		if (location.hash && location.hash.split('|')[0] === '#redirectmaker') {
			$('#tourwiki-select').val('redirect');
		}
		$('#tourwiki-select').change();
	}
	$(window).on('hashchange', onHashChange);
	onHashChange();

	function resolveUserRequests(delimiter) {
		return $('#tourwiki-main').val().trim().split('\n')
			.filter(function (x) {
				return x.indexOf(delimiter) !== -1;
			}).map(function (x) {
				if ($('#tourwiki-select').val() === 'category') {
					x = x.replace(/زمرو:/, '').replace(/Category:/i, '');
				}

				x = x.split(delimiter);
				x[0] = x[0].split('>').slice(-1)[0].trim();
				x[1] = x[1].split('>').slice(-1)[0].trim();

				if ($('#tourwiki-select').val() === 'category') {
					x[0] = 'زمرو:' + x[0];
					x[1] = 'Category:' + x[1];
				}
				return x;
			});
	}
	
	function parseContent(content, title) {
		return new mw.Api().post({
			action: 'parse',
			text: content,
			contentmodel: 'wikitext',
			prop: 'text',
			pst: '',
			title: title || 'API'
		}).then(function (data) { return data.parse.text['*']; });
	}

	function preSavedTransform(content, title) {
		return new mw.Api().post({
			action: 'parse',
			text: content,
			contentmodel: 'wikitext',
			prop: 'text',
			onlypst: '',
			title: title || 'API'
		}).then(function (data) { return data.parse.text['*']; });
	}
	
	function createPage(title, text, summary) {
		return new mw.Api().post({
			action: 'edit',
			title: title,
			text: text,
			summary: summary || '',
			createonly: '',
			bot: '',
			token: mw.user.options.get('csrfToken')
		}).then(function (response) {
			return response.error
				? $.Deferred().reject(response.error)
				: response;
		});
	}
	
	var wikidataTokenCache;
	function wikidataToken() {
		if (wikidataTokenCache) {
			return $.Deferred().resolve(wikidataTokenCache);
		}

		return $.ajax({
			url: '//www.wikidata.org/w/api.php',
			data: {
				action: 'query',
				meta: 'tokens',
				format: 'json',
				origin: location.protocol + '//' + location.hostname
			},
			xhrFields: { withCredentials: true }
		}).then(function (data) {
			var token = data.query.tokens.csrftoken;
			if (token === '+\\') {
				// not logged in
				return $.Deferred().reject('login');
			} else {
				wikidataTokenCache = token;
				return token;
			}
		});
	}

	function getWikidataId(enTitle) {
		return new mw.Api({ ajax: { url: '//www.wikidata.org/w/api.php' } }).get({
			action: 'wbgetentities',
			format: 'json',
			sites: 'enwiki',
			titles: enTitle,
			props: 'info',
			origin: location.protocol + '//' + location.hostname
		}).then(function (x) {
			return x.entities[Object.keys(x.entities)[0]].id;
		});
	}
	
	function addWikidataSitelink(token, wikidataId, title, site) {
		return $.ajax({
			url: '//www.wikidata.org/w/api.php',
			type: 'POST',
			data: {
				action: 'wbsetsitelink',
				format: 'json',
				id: wikidataId,
				linksite: site,
				linktitle: title,
				bot: '1',
				token: token,
				origin: location.protocol + '//' + location.hostname
			},
			xhrFields: { withCredentials: true }
		}).then(function (data) {
			return data.error ? $.Deferred().reject(data.error) : data;
		});
	}
});