کاربر:Jeeputer/coordinatesCorrector.js
ظاهر
کدهایی که در این صفحه قرار میدهید، ممکن است حاوی محتوای مخربی باشند که حساب کاربری شما را به خطر میاندازند. اگر با استفاده از دستور «importScript» یا الگوی «نصب اسکریپت کاربری» اسکریپتی را از صفحهای دیگر درونریزی میکنید، دقت داشتهباشید که این کار باعث میشود تا بهطور سیال اسکریپتی را بارگیری کنید که امکان تغییر آن توسط دیگران وجود دارد. اگر از امنیت کدهایی که به این صفحه میافزایید مطمئن نیستید، در قهوهخانهٔ فنی درخواست کمک کنید. هرگاه پیشنمایش تغییراتی که در این صفحه اعمال کردهاید را مشاهده کنید، کد اجرا خواهد شد. |
مستندات این اسکریپت کاربری را میتوان در کاربر:Jeeputer/coordinatesCorrector قرار داد. |
$(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();
});
}
});