کاربر:Jeeputer/coordinatesCorrector.js

نکته: برای دیدن تغییرات، ممکن است نیاز باشد که حافظهٔ نهانی مرورگر خود را پس از انتشار پاک‌سازی کنید. گوگل کروم، فایرفاکس، مایکروسافت اج و سافاری: کلید ⇧ Shift را نگه دارید و روی دکمهٔ Reload در نوار ابزار مرورگر کلیک کنید. برای آگاهی از جزئیات و نحوهٔ پاک‌سازی حافظهٔ نهانی سایر مرورگرها، صفحهٔ ویکی‌پدیا:میانگیر مرورگرتان را خالی کنید را ببینید.
$(function() {
	var api = new mw.Api(),
		catTitle = 'صفحه‌هایی که از جعبه‌های اطلاعات با پارامترهای منسوخ مختصات استفاده می‌کنند',
		pages = [],
		stopped,
		notABot = !mw.config.get('wgUserGroups').includes('bot'),
		notInCatNamespace = mw.config.get('wgNamespaceNumber') !== 14;
	if (notABot || notInCatNamespace) {
		return false;
	}
	function savePage(options, summary) {
        return api.postWithToken('csrf', {
            action: 'edit',
            title: options.title,
            text: options.content,
            summary: summary,
            minor: true
        }).done(function(result) {
        	if (result.error) {
        		mw.notify(
        			$('<span>صفحهٔ «' + options.title + '» ذخیره نشد:<br/>' + result.error.info + '</span>'),
        			{type: 'error', tag: 'coord-corrector-notification'}
    			);
        	} else {
        		mw.notify(
        			$('<span>صفحهٔ «' + options.title + '» ذخیره شد.</span>'),
        			{type: 'success', tag: 'coord-corrector-notification'}
    			);
        	}
        });
	}
    function prepareNewText(options) {
    	var coordinates = '\n| مختصات = ' + options.template + '\n';
        var newContent = options.content
        	.replace(/\n?\|\s*lat(d|m|s|NS)\s*\=\s*[^\s\|]*\s*/g, '')
        	.replace(/\n?\|\s*long(d|m|s)\s*\=\s*[^\s\|]*\s*/g, '')
        	.replace(/\n?\|\s*longEW\s*\=\s*[^\s\|]*\s*/, coordinates);
    	options.content = newContent;
        savePage(
        	options,
        	'جایگزینی پارامترهای مختصات منسوخ‌شده با الگوی {{Coord}}'
        	);
    }
    function constructTemplate(options) {
    	var template = '{{coord';
    	var params = options.paramNames;
    	for (var i = 0; i < params.length; i++) {
    		var value = options.values[params[i]];
    		if (value) {
    			template += '|' + value;
    		}
    	}
    	template += '|display=inline,title}}';
    	options.template = template;
        prepareNewText(options);
    }
    function findValue(text, param) {
    	var re = new RegExp(`${param}\\s*\\=\\s*([^\\s\\|]*)`);
        var val = text.match(re) ? text.match(re)[1] : '';
        return val;
    }
    function populateValuesObject(options) {
        options.values = {};
        var paramName, value;
            options.paramNames = ['latd', 'latm', 'lats', 'latNS', 'longd', 'longm', 'longs', 'longEW'];
        for (var i = 0; i < options.paramNames.length; i++) {
            paramName = options.paramNames[i];
            value = findValue(options.content, paramName);
            options.values[paramName] = value;
        }
        constructTemplate(options);
    }
    function stepIn(title) {
    	var options = {};
    		options.title = title;
        return api.get({
            action: 'query',
            prop: 'revisions',
            titles: title,
            rvprop: 'content',
            format: 'json'
        }).then(function(data) {
            options.content = Object.values(data.query.pages)[0].revisions[0]['*'];
            populateValuesObject(options);
        });
    }
    function processCategoryMembers(result) {
    	var members = result.query.categorymembers;
    	for (var m = 0; m < members.length; m++) {
    		pages.push(members[m].title);
    	}
    	if (result.continue) {
    		getCategoryMembers(result.continue);
    		return;
    	}
    	// https://stackoverflow.com/a/3583740/15104823
    	(function loop(p) {
    		if (stopped) {
    			mw.notify('فرایند متوقف شد.', {
                    type: 'warn',
                    tag: 'coord-corrector-notification'
                });
    			return;
    		}
			setTimeout(function() {
				stepIn(pages[p]);
				if (--p) loop(p);
			}, 3000);
    	})(pages.length);
    }
    function getCategoryMembers(cont) {
    	var query = {
    		action: 'query',
    		format: 'json',
    		list: 'categorymembers',
    		cmtitle: 'رده:' + catTitle,
            cmprop: 'title',
            cmlimit: 500
    	};
    	if (cont) {
    		$.extend(query, cont);
    	}
    	api.get(query).done(function(result) {
    		processCategoryMembers(result);
    	});
    }
    if (mw.config.get('wgTitle') == catTitle) {
    	var button = new OO.ui.ButtonInputWidget({
			label: 'آغاز فرایند',
			flags: ['primary', 'progressive'],
			type: 'submit'
		});
		var cancelButton = new OO.ui.ButtonWidget({
			icon: 'cancel',
			title: 'لغو',
			flags: ['destructive'],
			disabled: true
		});
		var buttonLayout = new OO.ui.HorizontalLayout({
			items: [button, cancelButton]
		});
		var form = new OO.ui.FormLayout({
			items: [buttonLayout],
			classes: ['oo-ui-horizontalLayout']
		});
		var $div = $('<div>').append(form.$element);
		$('<h2>').text('اصلاح پارامترهای منسوخ').insertAfter('.mw-parser-output').after($div);
		button.on('click', function() {
			stopped = false;
			button.setDisabled(true);
			button.setLabel('در حال انجام...');
			cancelButton.setDisabled(false);
			cancelButton.on('click', function() {
				stopped = true;
				button.setDisabled(false);
				button.setLabel('آغاز فرایند');
				cancelButton.setDisabled(true);
			});
			getCategoryMembers();
		});
    }
});