MediaWiki:Gadget-bulkEdit.js

Da Wikisource

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);
Traesto fora da Wikipèdia - L'ençiclopedia łìbara e cołaboradiva in łéngua Vèneta "https://vec.wikisource.org/w/index.php?title=MediaWiki:Gadget-bulkEdit.js&oldid=70264"