$(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();
});
}
});