/******************************************************
QuickReCat (QRC, Quick ReCategorization) - narzędzie dla administratorów do rekategoryzacji
Autor: ]
Wersja: 0.3.0
******************************************************/
var QuickReCat = {
defaultReasons: [ //domyślne powody
{
button: 'standard',
reason: 'standaryzacja'
},
{
button: 'typo',
reason: 'poprawa typografii'
},
{
button: 'poprawnie',
reason: 'poprawna forma'
}
],
controlNum: 0, //hack; zmienna globalna, potrzebna do wyslania tylko ostatnio podanych danych
createFieldSet: function() {
// Tworzy diva, ktory jest glownym kontenerem
jQuery('<div/>', {
id: 'qrc-container',
style: 'max-width: 750px; border: 1px solid #CCC; text-align:center; border-radius: 10px; padding: 15px; margin: 0 auto;'
}).appendTo('#mw-content-text');
// Tworzy fieldset layout.
var qrc_fieldset = new OO.ui.FieldsetLayout({
label: 'Quick ReCat',
classes:
});
var qrc_input_from = new OO.ui.TextInputWidget({
placeholder: 'Obecny tytuł kategorii',
"class": "qrc-input",
id: 'qrc-from',
required: true,
validate: 'non-empty'
});
var qrc_input_to = new OO.ui.TextInputWidget({
placeholder: 'Nowy tytuł kategorii',
"class": "qrc-input",
id: 'qrc-to',
required: true,
validate: 'non-empty'
});
var qrc_input_reason = new OO.ui.TextInputWidget({
placeholder: 'Powód przenosin',
"class": "qrc-input",
id: 'qrc-reason',
required: true,
validate: 'non-empty',
});
//dołącza stworzone itemy do fieldsetu, przypisuje etykiety
qrc_fieldset.addItems([
new OO.ui.FieldLayout(qrc_input_from, {
label: 'Obecny tytuł kategorii',
align: 'right',
}),
new OO.ui.FieldLayout(qrc_input_to, {
label: 'Nowy tytuł kategorii',
align: 'right'
}),
new OO.ui.FieldLayout(qrc_input_reason, {
label: 'Powód przenosin',
align: 'right'
}),
]);
//dołącza fieldset do kontenera
$('#qrc-container').append(qrc_fieldset.$element);
//div z domyslnymi powodami przenosin
jQuery('<div/>', {
id: 'qrc-default-reasons',
style: 'width:100%; margin:5px; text-align: center;'
}).appendTo('#qrc-container');
for (var i = 0; i < QuickReCat.defaultReasons.length; i++) {
jQuery('<span/>', {
"class": 'qrc_reasonButton',
style: 'border: 1px solid #6b8e23; background-color:#9acd32 ; font-size:75%; padding: 2px; margin: 2px;',
title: QuickReCat.defaultReasons.reason,
html: QuickReCat.defaultReasons.button
}).appendTo('#qrc-default-reasons');
}
$(document).on('click', '.qrc_reasonButton', function() {
console.log("QRC: Wybrano powód:" + $(this).attr('title'));
qrc_input_reason.setValue($(this).attr('title'));
});
// Przycisk "Analizuj"
var qrc_button_analyse = new OO.ui.ButtonInputWidget({
type: 'submit',
useInputTag: true,
id: 'qrc-analyse-button',
label: 'Analizuj',
flags: [
'primary',
'progressive'
]
});
$('#qrc-container').append(qrc_button_analyse.$element);
//div na komunikaty otrzymywane pozniej
jQuery('<div/>', {
id: 'qrc-message-container',
style: 'width:100%; margin:5px;'
}).appendTo('#qrc-container');
console.log("QRC: Utworzono formularz");
// po kliknieciu na "Analizuj" -> idz do funkcji convertForm()
var qrc_params ={};
$(document).on('click', '#qrc-analyse-button', function() {
QuickReCat.controlNum++;
qrc_params = {
from: qrc_input_from.getValue().trim(),
to: qrc_input_to.getValue().trim(),
reason: qrc_input_reason.getValue().trim(),
worklist:
};
QuickReCat.convertForm(qrc_params);
});
},
convertForm: function(qrc_params) {
//wyczyść dotychczasowe komunikaty (jeśli są)
$('#qrc-message-container').empty();
if (qrc_params.from.length !== 0 && qrc_params.to.length !== 0 && qrc_params.reason.length !== 0) {
qrc_params.from = QuickReCat.niceCatName(qrc_params.from);
qrc_params.to = QuickReCat.niceCatName(qrc_params.to);
console.log("QRC: Formularz wypełniony poprawnie");
QuickReCat.checkCats(qrc_params);
}
},
checkCats: function(qrc_params) {
var from_nr, from_tp, to_nr, to_tp;
var params_from = {
action: 'query',
prop: 'info',
inprop: 'talkid',
titles: qrc_params.from,
format: 'json'
};
var params_to = {
action: 'query',
prop: 'info',
inprop: 'talkid',
titles: qrc_params.to,
format: 'json'
};
$.when(
$.ajax({
url: mw.util.wikiScript('api'),
data: params_from,
success: function(data) {
from_nr = Object.getOwnPropertyNames(data.query.pages);
if (data.query.pages.talkid === undefined)
from_tp = false;
else
from_tp = true;
}
}),
$.ajax({
url: mw.util.wikiScript('api'),
data: params_to,
success: function(data) {
to_nr = Object.getOwnPropertyNames(data.query.pages);
if (data.query.pages.talkid === undefined)
to_tp = false;
else
to_tp = true;
}
})).then(function checkCatsCallback(data1, data2) {
if (from_nr > 0 && to_nr < 0 && to_tp === false && qrc_params.to != qrc_params.from) {
QuickReCat.displayMsg("Można wykonać przenosiny z $1 do $2.", 'success', qrc_params.from, qrc_params.to);
if (from_tp)
QuickReCat.displayMsg("Wraz z $1 przeniesiona zostanie jej strona dyskusji.", 'info', qrc_params.from);
QuickReCat.getCategoryMembers(qrc_params); //teraz pora zdobyć listę stron w kategorii
} else {
if (from_nr < 0)
QuickReCat.displayMsg("$1 nie istnieje, a powinna.", 'error', qrc_params.from);
if (to_nr > 0)
QuickReCat.displayMsg("$1 istnieje, a nie powinna.", 'error', qrc_params.to);
if (to_nr < 0 && to_tp === true)
QuickReCat.displayMsg("Mimo że, $1 nie istnieje, to istnieje strona dyskusji. Zajmij się nią zanim dokonasz przenosin.", 'error', qrc_to);
if (qrc_params.to == qrc_params.from)
QuickReCat.displayMsg("Obie kategorie mają takie same nazwy. Nie mogę przenieść kategorii w to samo miejsce.", 'error');
}
});
},
editPage: function(qrc_params, qrc_iterator) {
QuickReCat.displayMsg("Poprawianie kategorii na stronach ($1)...<br />$2", 'editinfo', (qrc_iterator + 1) + "/" + qrc_params.worklist.length, qrc_params.worklist);
console.log("QRC: Edytuję stronę "+qrc_params.worklist);
var params = {
action: 'query',
prop: 'revisions',
titles: qrc_params.worklist,
rvprop: 'content',
rvlimit: 1,
format: 'json'
};
$.ajax({
url: mw.util.wikiScript('api'),
data: params,
success: function(data) {
/*Pobieranie ostatniej wersji artykułu*/
for (var pageid in data.query.pages)
break;
var temp = data.query.pages;
var qrc_text = temp.revisions ? temp.revisions : ''; //tekst ostatniej wersji artykułu
var qrc_newtext = qrc_text;
var qrc_modcat = qrc_params.from.replace(/Kategoria:/gi, '');
qrc_modcat = QuickReCat.escapeRegExp(qrc_modcat);
qrc_modcat = qrc_modcat.replace(/ /g, "\*");
// usuwanie unikodowych znaków sterujących - zaczerpnięte z ]
qrc_newtext = qrc_newtext.replace(//g, '');
/*Dwa przypadki - w kategorii może być klucz sortowania lub nie */
var qrc_fromregex = new RegExp("\\[\\[\\s*(Category|Kategoria)\\s*\\:\\s*" + qrc_modcat + "\\s*\\|", "gi");
var qrc_fromregex2 = new RegExp("\\\\]", "gi");
qrc_newtext = qrc_newtext.replace(qrc_fromregex, "[[" + qrc_params.to + "|");
qrc_newtext = qrc_newtext.replace(qrc_fromregex2, "]");
/*Prosta obsługa błedów*/
if ((qrc_text == qrc_newtext && qrc_text !== '') || qrc_newtext == qrc_text.replace(//g, '')) {
QuickReCat.displayMsg("Nie mogłem wykonać zamiany kategorii na stronie ]. Możliwe, że kategoria dodawana jest za pomocą szablonów.", 'error', qrc_params.worklist);
console.warn("QRC: {1) Nie mozna bylo wykonać zamiany na stronie " + qrc_params.worklist);
if ((qrc_iterator + 1) < qrc_params.worklist.length) {//mimo to, próbuj na następnej stronie
QuickReCat.editPage(qrc_params, qrc_iterator + 1);
}
} else if (qrc_text === '') {
QuickReCat.displayMsg("Nie mogłem wykonać zamiany kategorii na stronie ]. Możliwe, że strona nie istnieje.", 'error', qrc_params.worklist);
console.warn("QRC: (2) Nie mozna bylo wykonać zamiany na stronie " + qrc_params.worklist);
if ((qrc_iterator + 1) < qrc_params.worklist.length) {//mimo to, próbuj na następnej stronie
QuickReCat.editPage(qrc_params, qrc_iterator + 1);
}
} else /*Jeśli dobrze - zapisz*/ {
var editparams = {
action: 'edit',
title: qrc_params.worklist,
text: qrc_newtext,
token: mw.user.tokens.get('csrfToken'),
tags: "QRC",
summary: "Zmiana nazwy kategorii: " + qrc_params.from + " → ] (przy użyciu ])",
minor: true,
bot: true,
format: 'json'
};
$.ajax({
url: mw.util.wikiScript('api'),
type: "POST",
data: editparams,
success: function(data) {
if ((qrc_iterator + 1) < qrc_params.worklist.length) {
QuickReCat.editPage(qrc_params, qrc_iterator + 1);
}
else {
QuickReCat.displayMsg("Skrypt zakończył działanie. Odśwież, by zmienić kolejną kategorie.", "editinfo");
var qrc_button_refresh = new OO.ui.ButtonInputWidget({
type: 'submit',
useInputTag: true,
id: 'qrc-refresh-button',
label: 'ODŚWIEŻ!',
flags: [
'primary',
'progressive'
]
});
$('#qrc-container').append(qrc_button_refresh.$element);
$(document).on('click', '#qrc-refresh-button', function() {
location.reload();
});
}
},
error: function(data) {
QuickReCat.displayMsg("Błąd podczas zapisywania strony: $1", 'error', data.error.info);
console.error("QRC: Błąd podczas zapisu edycji na stronie: " + qrc_params.worklist);
}
});
}
},
error: function(data) {
QuickReCat.displayMsg("Błąd podczas pobierania zawartości strony: $1", 'error', data.error.info);
console.error("QRC: Błąd podczas pobierania zawartości strony: " + qrc_params.worklist);
}
});
},
getCategoryMembers: function(qrc_params)
{
var qrc_continue = "";
var qrc_query_params = {
action: 'query',
list: 'categorymembers',
cmtitle: qrc_params.from,
cmprop: 'title',
cmlimit: 1000,
cmcontinue: qrc_continue,
format: 'json'
};
var getCategoryMembersRead = function(data) {
for (var i = 0; i < data.query.categorymembers.length; i++)
qrc_params.worklist.push(data.query.categorymembers.title);
if (data === undefined) {
QuickReCat.displayMsg("W $1 znajduje się $2 stron.", 'info', qrc_params.from, qrc_params.worklist.length);
if (mw.config.get("wgUserGroups").indexOf("flood") == -1 && qrc_params.worklist.length > 10)
QuickReCat.displayMsg("Zostaną wykonane zmiany na więcej niż 10 stronach ($1). Rozważ, czy nie warto włączyć <i>flood flagi</i>.", 'info', qrc_params.worklist.length);
QuickReCat.displayMsg("Klikając przycisk „Potwierdzam!” jesteś odpowiedzialny za wszystkie merytoryczne zmiany, " +
"które zostaną wykonane na stronach Wikipedii. Upewnij się, że wprowadzone parametry są prawidłowe.", 'warning');
//przycisk potwierdzajacy
var qrc_button_confirm = new OO.ui.ButtonInputWidget({
type: 'submit',
useInputTag: true,
id: 'qrc-confirm-button'+QuickReCat.controlNum,
label: 'POTWIERDZAM!',
disabled: true,
flags: [
'primary',
'progressive'
]
});
$('#qrc-message-container').append(qrc_button_confirm.$element);
setTimeout(function() {
qrc_button_confirm.setDisabled(false);
}, 1000);
$(document).one('click', '#qrc-confirm-button'+QuickReCat.controlNum, function() {
console.log("QRC: Kliknięto przycisk 'Potwierdzam'");
$('#qrc-message-container').empty();
$('#qrc-analyse-button').prop('disabled', true);
QuickReCat.moveCats(qrc_params);
});
} else {
qrc_continue = data;
getCategoryMembersContinue();
}
};
var getCategoryMembersContinue = function() {
$.ajax({
url: mw.util.wikiScript('api'),
data: qrc_query_params,
success: getCategoryMembersRead
});
};
$.ajax({
url: mw.util.wikiScript('api'),
data: qrc_query_params,
success: getCategoryMembersRead,
error: function(data) {
console.error("QRC: Nie można pobrać listy stron należącej do kategorii")
}
});
},
moveCats: function(qrc_params) {
var qrc_corr;
$.ajax({
url: mw.util.wikiScript('api'),
type: "POST",
data: {
action: 'move',
from: qrc_params.from,
to: qrc_params.to,
tags: "QRC",
reason: qrc_params.reason + " (przy użyciu ])",
token: mw.user.tokens.get('csrfToken'),
noredirect: true,
movetalk: true,
format: 'json'
},
success: function(data) {
QuickReCat.displayMsg("Kategoria przeniesiona!", 'success');
console.log("QRC: Kategoria przeniesiona pomyślnie, rozpoczynam poprawianie stron");
QuickReCat.editPage(qrc_params, 0);
},
error: function(data) {
QuickReCat.displayMsg("Błąd: $1", 'error', data.error.info);
console.error("QRC: Błąd przenosin kategorii: " + data.error.info);
}
});
},
displayMsg: function(qrc_msg, qrc_msgtype, qrc_msgParam1, qrc_msgParam2) {
$('#qrc-message-container').css({
'border-top': '1px solid #EEE',
'padding-top': '5px',
'margin-top': '5px'
});
if (typeof qrc_msgParam1 !== undefined) {
qrc_msg = qrc_msg.replace('$1', qrc_msgParam1);
if (typeof qrc_msgParam2 !== undefined)
qrc_msg = qrc_msg.replace('$2', qrc_msgParam2);
}
if ($('#qrc_editinfo').length !== 0 && qrc_msgtype == 'editinfo') {
document.getElementById('qrc_editinfo').innerHTML = "<b>INFO:</b> " + qrc_msg;
return;
}
var msgbox = document.createElement('div');
msgbox.style.width = "90%";
msgbox.style.margin = "0 auto";
msgbox.style.marginBottom = "5px";
msgbox.style.padding = "2px 5px 2px 20px";
msgbox.style.borderRadius = "0.2em";
msgbox.style.textAlign = "left";
if (qrc_msgtype == 'error') {
msgbox.style.backgroundColor = "#FF9494";
msgbox.style.border = "2px solid #CB4154";
msgbox.innerHTML = "<b>BŁĄD:</b> ";
}
if (qrc_msgtype == 'success') {
msgbox.style.backgroundColor = "#93DB70";
msgbox.style.border = "2px solid #659D32";
msgbox.innerHTML = "<b>OK:</b> ";
}
if (qrc_msgtype == 'info') {
msgbox.style.backgroundColor = "#78b1dd";
msgbox.style.border = "2px solid #2b73ab";
msgbox.innerHTML = "<b>INFO:</b> ";
}
if (qrc_msgtype == 'warning') {
msgbox.style.backgroundColor = "#FFCC00";
msgbox.style.border = "2px solid #FF6600";
msgbox.innerHTML = "<b>UWAGA:</b> ";
}
if (qrc_msgtype == 'editinfo') {
msgbox.style.backgroundColor = "#78b1dd";
msgbox.style.border = "2px solid #2b73ab";
msgbox.id = "qrc_editinfo";
msgbox.innerHTML = "<b>INFO:</b> ";
}
msgbox.innerHTML += qrc_msg;
$(msgbox).appendTo('#qrc-message-container');
},
niceCatName: function(qrc_catName) {
//otrzymujemy ładne nazwy kategorii: Kategoria:Nazwa
qrc_catName = qrc_catName.replace(/Kategoria:/gi, '');
qrc_catName = qrc_catName.replace(/\s+/g, ' ');
qrc_catName = qrc_catName.trim().charAt(0).toUpperCase() + qrc_catName.trim().slice(1);
return "Kategoria:" + qrc_catName;
},
escapeRegExp: function(qrc_catName) {
return qrc_catName.replace(/{}]/g, '\\$&');
}
};
$(document).ready(function()
{
mw.loader.using().done(function() {
if(mw.config.get('wgPageName')=="Specjalna:Pusta_strona/QRC" && (mw.config.get("wgUserGroups").indexOf("sysop")>=0 || mw.config.get("wgUserGroups").indexOf("bot")>=0))
{
$( '#mw-content-text' ).empty();
var qrc_p=document.createElement('p');
qrc_p.innerHTML="Narzędzie QuickReCat (QRC) pozwala na szybką zmianę kategorii. <a href=\"https://wikifreehand.com/pl/Wikipedysta:Tufor/Quick_ReCat\">Dokumentacja</a>.";
$( '#mw-content-text' ).append( qrc_p );
QuickReCat.createFieldSet();
}
});
});