مدیاویکی:FairUseResize.js

نکته: برای دیدن تغییرات، ممکن است نیاز باشد که حافظهٔ نهانی مرورگر خود را پس از انتشار پاک‌سازی کنید. گوگل کروم، فایرفاکس، مایکروسافت اج و سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload در نوار ابزار مرورگر کلیک کنید. برای آگاهی از جزئیات و نحوهٔ پاک‌سازی حافظهٔ نهانی سایر مرورگرها، صفحهٔ ویکی‌پدیا:میانگیر مرورگرتان را خالی کنید را ببینید.

(function () {
	'use strict';
	
	function calculateFairUseSize(width, height) {
		// https://wcam-bot.toolforge.org
		var x = Math.sqrt(100000 / (width * height));
		return {
			width: Math.floor(width * x),
			height: Math.floor(height * x)
		};
	}
	
	function getBlob(url) {
		return new Promise(function (resolve) {
			var xhr = new XMLHttpRequest();
			xhr.onreadystatechange = function () {
				if (this.readyState == 4 && this.status == 200) {
					resolve(this.response);
				}
			};
			xhr.open('GET', url);
			xhr.responseType = 'blob';
			xhr.send();
		});
	}
	
	function upload(title, blob) {
		var formData = new FormData();
		formData.append('action', 'upload');
		formData.append('filename', title);
		formData.append('token', mw.user.tokens.get('csrfToken'));
		formData.append('format', 'json');
		formData.append('comment', 'کوچک کردن تصویر غیر آزاد');
		formData.append('ignorewarnings', '1');
		formData.append('file', blob);
		return $.ajax({
			url: mw.util.wikiScript('api'),
			contentType: false,
			processData: false,
			type: 'POST',
			data: formData
		});
	}
	
	function hideOldImage(title, id, reason) {
		return new mw.Api().post({
			action: 'revisiondelete',
			target: title,
			type: 'oldimage',
			ids: id,
			hide: 'content',
			reason: reason,
			token: mw.user.tokens.get('csrfToken')
		});
	}
	
	function getOldIds(title) {
		return new mw.Api().get({
			action: 'query',
			titles: title,
			prop: 'imageinfo',
			iiprop: 'archivename',
			iilimit: 'max'
		}).then(function (x) {
			return Object.values(x.query.pages)[0].imageinfo
				.filter(function (x) { return x.archivename; })
				.map(function (x) { return x.archivename.split('!')[0]; })
				.join('|');
		});
	}
	
	$(function () {
		var img = document.querySelector('.fullImageLink img');
		if ((mw.config.get('wgUserGroups').indexOf('sysop') === -1
		     && mw.config.get('wgUserGroups').indexOf('eliminator') === -1)
			|| !img
			|| /\.(svg|pdf)$/i.exec(mw.config.get('wgTitle'))
			|| mw.config.get('wgCategories').indexOf('محتویات غیر آزاد')/*m*/ === -1
			|| img.width * img.height < 110000)
			return;
		
		$(mw.util.addPortletLink(
			'p-views', '#',	'کوچک کردن تصویر', 'ca-fairuseresize',
			'کوچک کردن خودکار اندازهٔ تصور جهت هماهنگی با سیاست استفاده منصفانه'
		)).click(function (e) {
			e.preventDefault();
			mw.notify('در حال کوچک کردن اندازهٔ تصویر…');
			getBlob(new mw.Uri('/w/thumb.php').extend({
				f: mw.config.get('wgTitle'),
				w: calculateFairUseSize(img.width, img.height).width
			})).then(function (blob) {
				return upload(mw.config.get('wgPageName'), blob);
			}).then(function () {
				return getOldIds(mw.config.get('wgPageName'));
			}).then(function (ids) {
				return hideOldImage(
					mw.config.get('wgPageName'),
					ids,
					'حذف نسخهٔ بزرگتر از استفادهٔ منصفانه'
				);
			}).then(function () {
				location.href = location.href;
			});
		});
	});
}());