MediaWiki:Gadget-bulkEdit.js
Ocio: Daspò ver salvà, podaria esare neçesario snetare ła cache dal propio navegadore web par vedare i canbiamenti.
- Firefox / Safari: tegner strucà el boton de łe letare grande Shift e schiciare sora Ricarga, o se nò struca Ctrl-F5 o Ctrl-R (⌘-R so Mac)
- Google Chrome: strucare Ctrl-Shift-R (⌘-Shift-R so on Mac)
- Internet Explorer / Edge: tegner strucà el boton Ctrl e schiciare so Ajorna, o sinò Ctrl-F5
- Opera: Va in tel Menu → Inpostasion (Opera → Prefarense so on Mac) e pò in Privacy & sicuresa → Sneta dati del navegadore → Imajini e file in te ła cache.
(function($,mw) {
console.log('Modifica massiva v. 0.34');
if (mw.config.get("wgCanonicalNamespace") !== '') {
return;
}
mw.util.addPortletLink(
'p-tb',
'#',
'Modifica massiva',
't-bulkEdit',
'Modifica massiva (indentazione)'
);
$('#t-bulkEdit').click(function(e) {
e.preventDefault();
if ($("#bulkEditDialog").length) {
//already opened
return;
}
new mw.Api().get({action: 'query', prop: 'revisions', rvprop: 'content', titles: mw.config.get("wgPageName"), format: 'json'}).done(function (data) {
$.each(data.query.pages, function(index, element) {
//testo della pagina corrente
ns0text = element.revisions[0]['*'];
tagPages = $('<div>' + ns0text + '</div>').find('pages');
pagesList = [];
pagesNumList = [];
pageSections = {};
indexPage = '';
if (tagPages.length === 0) {
alert('Non ci sono pagine trascluse su cui agire.');
return;
}
//parsa i tag pages
for (i = 0; i < tagPages.length; i++) {
indexPage = $(tagPages[i]).attr('index');
from = $(tagPages[i]).attr('from');
to = $(tagPages[i]).attr('to');
//ci salviamo l'elenco delle sezioni
fromSection = $(tagPages[i]).attr('fromsection');
toSection = $(tagPages[i]).attr('tosection');
if (fromSection) {
pageSections['Pagina:' + indexPage + '/' + from] = fromSection;
}
if (toSection) {
pageSections['Pagina:' + indexPage + '/' + to] = toSection;
}
console.log("Page sections: " + JSON.stringify(pageSections));
for (j = parseInt(from); j <= parseInt(to); j++) {
pagesList.push('Pagina:' + indexPage + '/' + j);
pagesNumList.push(j);
}
}
console.log('Pagine trascluse: ' + pagesList);
//carica tutte le pagine
new mw.Api().get({action: 'query', prop: 'revisions', rvprop: 'content', titles: pagesList.join('|'), format: 'json'}).done(function (data) {
lines = [];
textBefore = {};
textAfter = {};
//riordino le pagine per titolo
pagesArray = [];
for (var p in data.query.pages) {
pagesArray.push(data.query.pages[p]);
}
pagesArray.sort(function (a, b) {
var aTitle = parseInt(a.title.substring(a.title.indexOf('/')+1));
var bTitle = parseInt(b.title.substring(b.title.indexOf('/')+1));
return ((aTitle < bTitle) ? -1 : ((aTitle > bTitle) ? 1 : 0));
});
$.each(pagesArray, function(index, element) {
pagetext = element.revisions[0]['*'];
console.log(element.title);
console.log(pagetext);
//in questo caso dobbiamo agire solo dentro la sezione
if (element.title in pageSections) {
reBegin = new RegExp('<section begin="?' + pageSections[element.title] + '"? ?\/>');
reEnd = new RegExp('<section end="?' + pageSections[element.title] + '"? ?\/>');
splitBegin = pagetext.search(reBegin) + (pagetext.match(reBegin)[0].length);
splitEnd = pagetext.search(reEnd);
textBefore[element.title] = pagetext.substring(0, splitBegin);
textAfter[element.title] = pagetext.substring(splitEnd);
pagetext = pagetext.substring(splitBegin, splitEnd);
console.log('Section: ' + pageSections[element.title]);
console.log(pagetext);
}
//splitta sulle singole linee e vedi di capire se è un verso o no
pageLines = pagetext.split(/\r?\n/);
isPoem = false;
isCenter = false;
for (i = 0; i < pageLines.length; i++) {
isVerse = false;
isCenterTl = pageLines[i].indexOf('{{Centra') != -1;
if (!isCenter && (pageLines[i].indexOf('<center>') != -1 || isCenterTl)) {
isCenter = true;
}
if (isPoem && pageLines[i].indexOf('</poem>') != -1 && pageLines[i].indexOf('<poem>') != -1) {
if (!isCenter && (
pageLines[i].substring(0, pageLines[i].indexOf('</poem>')).trim() !== '' ||
pageLines[i].substring(pageLines[i].indexOf('<poem>') + 6).trim() !== '') ) {
isVerse = true;
}
}
else if (isPoem && pageLines[i].indexOf('</poem>') != -1) {
isPoem = false;
if (!isCenter && pageLines[i].substring(0, pageLines[i].indexOf('</poem>')).trim() !== '') {
isVerse = true;
}
}
else if (!isPoem && pageLines[i].indexOf('<poem>') != -1) {
isPoem = true;
if (!isCenter && pageLines[i].substring(pageLines[i].indexOf('<poem>') + 6).trim() !== '') {
isVerse = true;
}
}
else {
isVerse = isPoem && !isCenter && pageLines[i].trim() !== '' && pageLines[i].indexOf('{{Centra') == -1;
}
lines.push({'page': element.title, 'text': pageLines[i], 'isVerse': isVerse, 'isPoem': isPoem, 'isCenter': isCenter, 'keep': true, 'isLast': (i+1 == pageLines.length) });
if (isCenter && (pageLines[i].indexOf('</center>') != -1 || isCenterTl)) {
isCenter = false;
}
}
});
totVerses = 0;
for (i = 0; i < lines.length; i++) {
if (lines[i].isVerse) {
totVerses++;
}
console.log('poem:' + lines[i].isPoem + ' center:' + lines[i].isCenter + ' verse:' + lines[i].isVerse + ' ' + lines[i].text);
}
console.log('Trovati ' + totVerses + ' versi');
//indentation = window.prompt('Trovati ' + totVerses + ' versi.\nIndentazione (es. 011 per indentare il 2^ e il 3^ verso):');
//mostra il popup
$("body").append('<div id="bulkEditDialog" class="ws-dialog" style="width: 450px;"></div>');
$("#bulkEditDialog").append('<input type="hidden" id="bulkEditIndentation"/></div>');
$("#bulkEditDialog").append('<div class="ws-icon-close"></div>');
$("#bulkEditDialog").append('<div class="ws-title">Modifica massiva</div>');
$("#bulkEditDialog").append('<div class="ws-row">' + (pagesNumList.length > 1 ? 'Pagine trascluse: ' : 'Pagina trasclusa: ') + pagesNumList.join('-') + '.</div>');
$("#bulkEditDialog").append('<div class="ws-row">Trovati <b>' + totVerses + '</b> versi.</div>');
$("#bulkEditDialog").append('<div class="ws-row"><u>Indentazione:</u> ripeti ogni <a class="ws-minus" id="bulkEditRepeatMinus" href="javascript:void(0)"></a><input id="bulkEditRepeat" class="input-1" value="0" maxlength="1"/><a class="ws-plus" id="bulkEditRepeatPlus" href="javascript:void(0)"></a> righe</div>');
$("#bulkEditDialog").append('<div class="ws-row bulkEditIndent"></div>');
$("#bulkEditDialog").append('<div class="ws-row"><div class="ws-6">Riga bianca a fine paragrafo: </div><div class="ws-4 ws-right"><select id="bulkEditWhiteline"><option value="">Non modificare</option><option value="A">Una riga bianca</option><option value="R">Nessuna riga bianca</option></select></div></div>');
$("#bulkEditDialog").append('<div class="ws-row ws-center"><a id="bulkEditButton" class="ws-blue-button" href="javascript:void(0)">Esegui</a></div>');
if (mw.config.get('wgUserGroups').indexOf('sysop') != -1) {
$("#bulkEditDialog").append('<div class="ws-row"><input id="bulkEditTest" type="checkbox"/> Test (non salvare, scrivi solo in console)</div>');
}
//centra nello schermo
//$('#bulkEditDialog').css({top:'50%',left:'50%',margin:'-'+($('#bulkEditDialog').height() / 2)+'px 0 0 -'+($('#bulkEditDialog').width() / 2)+'px'});
$('#bulkEditDialog').css({top:'40%', right: '50px', margin: '-' + ($('#bulkEditDialog').height() / 2)+'px 0 0 0'});
$('.ws-icon-close').click(function() {
$('#bulkEditDialog').remove();
});
$('#bulkEditRepeat').on('input', function() {
this.value = this.value.replace(/[^\d]/g,'');
});
updateString = function() {
indent = '';
$('.bulkEditIndent input').each(function() { indent += $(this).val(); });
$('#bulkEditIndentation').val(indent);
};
decrease = function() {
v = parseInt($(this).parent().find('input').val());
if (v > 0) {
$(this).parent().find('input').val(v - 1);
updateString();
}
};
increase = function() {
v = parseInt($(this).parent().find('input').val());
if (v < 9) {
$(this).parent().find('input').val(v + 1);
updateString();
}
};
$('#bulkEditRepeatMinus').click(function() {
repeat = parseInt($('#bulkEditRepeat').val());
if (repeat > 0) {
$('#bulkEditRepeat').val(repeat - 1);
$('.bulkEditIndent div').last().remove();
updateString();
}
});
$('#bulkEditRepeatPlus').click(function() {
repeat = parseInt($('#bulkEditRepeat').val());
if (repeat < 9) {
$('#bulkEditRepeat').val(repeat + 1);
$('.bulkEditIndent').append('<div>Rientro ' + (repeat + 1) + '° riga <a class="ws-minus" href="javascript:void(0)"></a><input value="0" class="input-1" maxlength="1"/><a class="ws-plus" href="javascript:void(0)"></a></div>');
$('.bulkEditIndent div').last().find('.ws-minus').click(decrease);
$('.bulkEditIndent div').last().find('.ws-plus').click(increase);
$('.bulkEditIndent div').last().find('input').on('input', function() {
this.value = this.value.replace(/[^\d]/g,'');
});
updateString();
}
});
$('.bulkEditIndent .ws-minus').click(decrease);
$('.bulkEditIndent .ws-plus').click(increase);
$('#bulkEditRepeatPlus').click();
$('#bulkEditButton').click(function() {
//applica l'indentazione voluta
indentation = $('#bulkEditIndentation').val();
isIndentation = indentation != '';
addWhiteline = $('#bulkEditWhiteline').val() == 'A';
removeWhiteline = $('#bulkEditWhiteline').val() == 'R';
isTest = $("#bulkEditTest").is(':checked');
$('#bulkEditDialog').remove();
numVerse = 0;
insidePoem = false;
spaces = ' ';
for (i = 0; i < lines.length; i++) {
if (isIndentation) {
if (lines[i].isVerse) {
indent = indentation.charAt(numVerse % indentation.length);
lines[i].text = spaces.repeat(parseInt(indent)) + lines[i].text.trim();
//aggiungi riga bianca se siamo alla fine del paragrafo
if (insidePoem && addWhiteline && ( (numVerse+1) % indentation.length == 0) ) {
lines[i].text += '\n';
}
numVerse++;
insidePoem = numVerse < totVerses;
}
else if (lines[i].text.trim() === '') {
//se le righe bianche vanno modificate, segno le vecchie come da rimuovere
if (insidePoem && (removeWhiteline || addWhiteline) ) {
lines[i].keep = false;
}
}
}
//TODO altre cose (find/replace ecc.)
}
//ricomponi il testo
pages = {};
for (i = 0; i < lines.length; i++) {
if (!pages[lines[i].page]) {
pages[lines[i].page] = [];
}
if (lines[i].keep) {
pages[lines[i].page].push(lines[i].text);
}
}
editToken = mw.user.options.get('csrfToken');
summary = 'Modifica massiva: indentazione';
var ajaxCounter = pagesList.length;
console.log('Ci sono ' + ajaxCounter + ' pagine da salvare');
//e salva le pagine una ad una
for (var pageName in pages) {
newText = pages[pageName].join('\n');
//rimetti il testo prima e dopo la sezione
if (pageName in textBefore) {
newText = textBefore[pageName] + newText;
}
if (pageName in textAfter) {
newText = newText + textAfter[pageName];
}
console.log('Pagina: ' + pageName);
console.log('Testo da salvare: \n' + newText);
if (!isTest) {
new mw.Api().post({action: 'edit', title: pageName, text: newText, summary: summary, token: editToken}).always(function( result, jqXHR ) {
ajaxCounter--;
console.log('Pagina ' + pageName + ' salvata. Mancano da salvare ' + ajaxCounter + ' pagine.');
if (ajaxCounter === 0) {
//fai un purge quando tutti i salvataggi sono completati
console.log('Tutti i salvataggi sono stati completati, purgo la pagina...');
new mw.Api().post( {action: 'purge', titles: mw.config.get('wgPageName')} ).then(function() {
location.reload();
}, function () {
mw.notify( 'Purge failed', { type: 'error' } );
});
}
});
}
else {
//test a vuoto, senza salvare
console.log("TEST - non faccio il salvataggio");
}
}
});
});
});
});
});
})($,mw);