MediaWiki:Gadget-showWikiCode.js

Da Wikisource.

Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.

  • Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
  • Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
  • Internet Explorer / Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5
  • Opera: premi Ctrl-F5.
// crea un tattoo per invocare la funzione show
$(document).ready(function() {
	
	var pagesText = [];
	var pagesCounter = 0;
	
	sortByPagina = function(parent) {
		var elems = parent.children().detach().sort(function (a, b) {
			return (parseInt($(a).data('pagina')) < parseInt($(b).data('pagina')) ? -1 : parseInt($(a).data('pagina')) > parseInt($(b).data('pagina')) ? 1 : 0);
		});
		parent.append(elems);
	};
	
	findLastPage = function() {
		var lastPage = $('.prp-index-pagelist a:not(.new):last');
		if (lastPage.length > 0) {
			var lastPageTitle = lastPage.attr('title');
			return parseInt(lastPageTitle.substring(lastPageTitle.lastIndexOf('/') + 1));
		} else {
			return 1;
		}
	};
	
	downloadFile = function(text) {
		var j = document.createElement("a");
		j.download = mw.config.get('wgTitle').replaceAll('/', ' - ') + '.txt';
		j.href = URL.createObjectURL(new Blob([text]));
		j.click();
	};
	
	escapeHTML = function(html) {
    	return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
	};
	
	sortErroriPt = function() {
	    $("#errori-pt-list li").sort(function(a, b) {
		    return ($(b).data('pagenum')) < ($(a).data('pagenum')) ? 1 : -1;
		}).appendTo('#errori-pt-list');
	};
	
	downloadWikitextFromNsPage = function(from, to, checkPt) {
		console.log("Scarica pagine da " + from + " a " + to);
		
		pagesCounter = to - from + 1;
		pagesText = new Array(pagesCounter);
		ptStart = new Array(pagesCounter);
		ptEnd = new Array(pagesCounter);
		var index = mw.config.get("wgCanonicalNamespace") == 'Index' ? mw.config.get("wgPageName").replace('Indice:', '') 
			: $('#ca-proofread-source a').attr('href').replace('/wiki/Indice:', '');
		
		for (page = from; page <= to; page++) {
			pagina = 'Pagina:' + index + '/' + page;
			$.ajax({
				url: "/w/api.php?action=parse&page=" + pagina + "&prop=wikitext&format=json",
			}).done(function(response) {
				pagesCounter--;
				if (response.parse) {
					var pageTitle = response.parse.title;
					var pageNum = parseInt(pageTitle.substring(pageTitle.lastIndexOf('/') + 1));
					var wikitext = response.parse.wikitext["*"];
					wikitext = wikitext.replace(/<noinclude>[\s\S]*?<\/noinclude>/gm, '');
					pagesText[pageNum - from] = wikitext;
					
					if (checkPt) {
						ptStart[pageNum] = escapeHTML(wikitext.substring(0, 60));
						ptEnd[pageNum] = escapeHTML(wikitext.substring(wikitext.length - 60));
					}
				}
				
				if (pagesCounter == 0) {
					if (checkPt) {
						var pagTitle = '/w/index.php?title=' + mw.config.get("wgPageName").replace('Indice:', 'Pagina:') + "/";
						for (p = from; p < to; p++) {
							// console.log("Pag. " + p + ": " + ptEnd[p]);
							if (ptEnd[p]) {
								var ptLast = ptEnd[p].match(/\{\{[Pp]t\s*\|/);
								if (ptLast && ptStart[p+1]) {
									var ptNext = ptStart[p+1].match(/\{\{[Pp]t\s*\|/);
									if (!ptNext) {
										// console.log("Errore in Pt pag. " + p + '-' + (p+1) + ': ' + ptEnd[p] + " " + ptStart[p+1]);
										$('#errori-pt-list').append('<li data-pagenum="' + p + '">pp. ' + '<a href="' + pagTitle + p + '&action=edit" target="_blank">' + p + '</a>-' + '<a href="' + pagTitle + (p+1) + '&action=edit" target="_blank">' + (p+1) + '</a>: '
											+ '<span class="errori-pt-code">' + ptEnd[p].substring(ptEnd[p].length - 40) + '<span class="errori-pt-separator">|</span>' + ptStart[p+1].substring(0, 40) + '</span></li>');
										sortErroriPt();
									}
								}
							}
						}
						for (p = from + 1; p <= to; p++) {
							if (ptStart[p]) {
								var ptFirst = ptStart[p].match(/\{\{[Pp]t\s*\|/);
								if (ptFirst && ptEnd[p-1]) {
									var ptPrev = ptEnd[p-1].match(/\{\{[Pp]t\s*\|/);
									if (!ptPrev) {
										// console.log("Errore in Pt pag. " + (p-1) + '-' + p + ': ' + ptEnd[p-1] + " " + ptStart[p]);
										$('#errori-pt-list').append('<li data-pagenum="' + (p-1) + '">pp. ' + '<a href="' + pagTitle + (p-1) + '&action=edit" target="_blank">' + (p-1) + '</a>-' + '<a href="' + pagTitle + p + '&action=edit" target="_blank">' + p + '</a>: '
											+ '<span class="errori-pt-code">' + ptEnd[p-1].substring(ptEnd[p-1].length - 40) + '<span class="errori-pt-separator">|</span>' + ptStart[p].substring(0, 40) + '</span></li>');
										sortErroriPt();
									}
								}
							}
						}
						if ($('#errori-pt-list li').length == 0) {
							$('#loading-errori-pt').html('Non è stato trovato nessun errore.');
						} else {
							$('#loading-errori-pt').html('Trovati i seguenti possibili errori:');
						}
						
					} else {
						var allWikitext = pagesText.join('\n');
						allWikitext = allWikitext.replace(/\r?\n?<\/poem>\n<poem>/g, '');
						downloadFile(allWikitext);
					}
				}
			});
		}
	};
	
	downloadWikitextFromNs0 = function() {
		var pageList = [];
		var basePage = mw.config.get("wgTitle");
		if (mw.config.get("wgNamespaceNumber") == 0) {
			$('.tl-testo a').each(function() {
				pageList.push($(this).attr('title'));
			});
		} else {
			var pageName = mw.config.get("wgPageName");
			var nsName = pageName.substring(0, pageName.indexOf(':'));
			basePage = nsName + ':' + basePage;
		}
		pageList.push(basePage);
		pagesCounter = pageList.length;
		pagesText = new Array(pagesCounter);
		
		for (var i = 0; i < pageList.length; i++) {
			$.ajax({
				url: "/w/api.php?action=parse&page=" + pageList[i] + "&prop=wikitext&format=json",
			}).done(function(response) {
				pagesCounter--;
				if (response.parse) {
					var pageTitle = response.parse.title;
					// console.log('Scaricata pagina ' + pageTitle);
					for (var j = 0; j < pageList.length; j++) {
						if (pageList[j] == pageTitle) {
							// console.log('Trovato titolo ' + pageTitle + ' al posto ' + j);
							var wikitext = response.parse.wikitext["*"];
							wikitext = wikitext.replace(/<noinclude>[\s\S]*?<\/noinclude>/gm, '');
							pagesText[j] = wikitext;
						}
					}
				}
				
				if (pagesCounter == 0) {
					var allWikitext = pagesText.join('\n');
					downloadFile(allWikitext);
				}
			});
		}
	};
	
	loadFromNsPagina = function(index, from, to) {
		console.log("showWikiCode: pages from " + from + " to " + to);
		if (from > 0 && to > 0 && from <= to) {
			$('#showWikiCodeSources').append('<div id="showWikiCodePages"></div>');
			
			// carica il wikitesto delle pagine
			for (page = from; page <= to; page++) {
				pagina = 'Pagina:' + index + '/' + page;
				$.ajax({
					url: "/w/api.php?action=parse&page=" + pagina + "&prop=wikitext&format=json",
				}).done(function(response) {
					if (response.parse) {
						page = response.parse.title;
						editlink = '/w/index.php?title=' + page + '&action=edit';
						page = page.substring(page.indexOf('/') + 1);
						
						// pezzo rubato spudoratamente da acchiappaWikicode()
						contenuto = response.parse.wikitext["*"].replace(/</g, "&lt;").replace(/>/g, "&gt;");
						var l = produciLista(contenuto, "{"+"{", "}}", 1, "{{");
						for (var i = 0; i < l.length; i += 1) {
							contenuto = contenuto.replace(l[i], '<span class="template">' + l[i] + '</span>');
						}
						contenuto = contenuto.replace(/\&lt;/g, '<span class="tag">&lt;').replace(/\&gt;/g, '&gt;</span>')
							.replace(/'''/g, "<span class=\"bold\">'''</span>")
							.replace(/''/g, "<span class=\"italic\">''</span>")
							.replace(/\n/g, "<br />");
						var noincludeList = produciLista(contenuto, '<span class="tag">&lt;noinclude&gt;</span>', '<span class="tag">&lt;/noinclude&gt;</span>', 1);
						var header = noincludeList[0];
						var footer = noincludeList[noincludeList.length - 1];
						var body = find_stringa(contenuto, header, footer, 0);
						
						var scroll = $('#showWikiCodePages').children().length == 0;
						var scrollTo = $('#showWikiCodeMain').prop("scrollHeight");
						
				  		$('#showWikiCodePages').append('<div data-pagina="' + page + '">' 
				  			+ '<div class="showWikiCodePageTitle">'
				  				+ '<a href="#pagename' + page + '">Pagina ' + page + '</a>'
				  				+ ' &middot; <a href="' + editlink + '" target="_new">modifica</a></div>'
				  			+ '<div class="showWikiCodePage">' + body + '</div></div>');
			  			sortByPagina($('#showWikiCodePages'));
			  			
			  			if (scroll) {
			  				$('#showWikiCodeMain').scrollTop(scrollTo);
			  			}
					}
				});
			}
			$('#showWikiCodeBox').draggable('option', 'cancel', '#showWikiCodeBody, .showWikiCodePageTitle, .showWikiCodePage');
		}
	};
	
	showWikiCodeBox = function() {
  		var wt = acchiappaWikicode(mw.config.get("wgPageName"));
	   
		var commandBar = '<div id="showWikiCodeCmdBar" class="box-title">Codice Wiki'
			+ '<span class="icon-close" id="delWikiCodeBtn"></span></div>'
			+ '<div id="showWikiCodeMain" class="box-main"><div id="showWikiCodeButtons"></div><div id="showWikiCodeSources">';
		var headerDiv = '<div id="showWikiCodeHeader">' + wt[0] + '</div>';
		var bodyDiv = '<div id="showWikiCodeBody">' + wt[1] + '</div>';
		var footerDiv = '<div id="showWikiCodeFooter">' + wt[2] + ' </div>';
		var box = '<div id="showWikiCodeBox" class="box">';
	
		box += commandBar;
		if (wt[0] !== "")
			box += headerDiv;
		box += bodyDiv;
		if (wt[0] !== "")
			box += footerDiv;
		box += '</div></div></div>';
	   
		$(box).appendTo($("body"));
		
		$('#showWikiCodeButtons').append('<button id="showWikiCodeDownloadAll" class="btn blue" title="Scarica tutto il testo wiki">Scarica il wikitesto</button>');
		
		// cerca un tag pages
		pagesString = find_stringa(wt[1], '&lt;pages', '/&gt;', true, "");
		if (pagesString != '') {
			$('#showWikiCodeButtons').append('<button id="showWikiCodeExpand" class="btn blue" title="Carica in questo box il testo trascluso dal nsPagina">Carica singole pagine</button>');
			$('#showWikiCodeDownloadAll').append(' dal nsPagina');
			if ($('.tl-testo').length > 0) {
				$('#showWikiCodeDownloadAll').append(', incluse sottopagine');
			}
		
			$('#showWikiCodeExpand').click(function() {
				$('#showWikiCodeExpand').attr('disabled', 'true');
				$('#showWikiCodeBox').css('height', '90%');
				var wt = acchiappaWikicode(mw.config.get("wgPageName"));
				pagesString = find_stringa(wt[1], '&lt;pages', '/&gt;', true, "");
				pagesString = pagesString.replace('&lt;', '<').replace('/&gt;', '/>');
				pages = $.parseHTML(pagesString);
				if (pages[0] && pages[0].attributes) {
					attr = pages[0].attributes;
					from = 0, to = 0;
					index = pages[0].attributes.index.value.replace(/"/g, '');
					if (attr.from && attr.from.value) {
						from = parseInt(pages[0].attributes.from.value.replace(/"/g, ''));
					}
					if (attr.to && attr.to.value) {
						to = parseInt(pages[0].attributes.to.value.replace(/"/g, ''));
					}
					loadFromNsPagina(index, from, to);
				}
			});
			
			$('#showWikiCodeDownloadAll').click(function () {
				if ($('.tl-testo').length > 0) {
					var lastPage = $('.tl-testo:last a').attr('title');
					$.ajax({
						url: "/w/index.php?&title=" + lastPage.replaceAll("&", "%26").replaceAll("?", "%3F")
					}).done(function(response) {
						var from = parseInt($('.numeropaginaFile:first').attr('id').replace("pagename", ""));
						var to = parseInt($('.numeropaginaFile:last', response).attr('id').replace("pagename", ""));
						
						downloadWikitextFromNsPage(from, to, false);
					});
				} else {
					var from = parseInt($('.numeropaginaFile:first').attr('id').replace("pagename", ""));
					var to = parseInt($('.numeropaginaFile:last').attr('id').replace("pagename", ""));
					
					downloadWikitextFromNsPage(from, to, false);
				}
			});
		} else if (mw.config.get("wgCanonicalNamespace") == 'Index') {
			$('#showWikiCodeDownloadAll').append(' del nsPagina');
			$('#showWikiCodeDownloadAll').click(function() {
				downloadWikitextFromNsPage(1, findLastPage(), false);
			});
			
			$('#showWikiCodeButtons').append('<button id="showWikiCodeExpand" class="btn blue" title="Carica in questo box il testo del nsPagina">Carica singole pagine</button>');
			$('#showWikiCodeExpand').click(function() {
				$('#showWikiCodeExpand').attr('disabled', 'true');
				$('#showWikiCodeBox').css('height', '90%');
				loadFromNsPagina(mw.config.get("wgTitle"), 1, findLastPage());
			});
		} else {
			// testo non dotato di scansioni
			if (mw.config.get("wgNamespaceNumber") == 0 && $('.tl-testo').length > 0) {
				$('#showWikiCodeDownloadAll').append(', incluse sottopagine');
			}
			$('#showWikiCodeDownloadAll').click(function () {
				downloadWikitextFromNs0();
			});
		}
		
		$('#delWikiCodeBtn').click(function(e) {
   			e.preventDefault();
			$("#showWikiCodeBox").remove();
		});
		
		$('#showWikiCodeBox').draggable({
		    create: function( event, ui ) {
		        $(this).css({
		            right: "auto",
		            bottom: "auto",
		            top: $(this).position().top,
		            left: $(this).position().left
		        });
		    }
		});
		$('#showWikiCodeBox').draggable('option', 'cancel', '#showWikiCodeBody, #showWikiCodeHeader, #showWikiCodeFooter');
	};
	
	showPtErrors = function() {
		$('.errori-pt-box').remove();
		$('#mw-content-text').prepend('<div class="box errori-pt-box">' +
			'<div class="box-title">Errori in Pt</a>' +
			'<span class="icon-close"></span></div>' +
			'<div class="box-main errori-pt-box-main"></div></div>');
		$('.errori-pt-box-main').html("<p>Questo strumento cerca eventuali template Pt presenti in fondo alle pagine, che non abbiano un corrispondente Pt all'inizio della pagina successiva (o viceversa).</p>" 
			+ '<span id="loading-errori-pt">Caricamento in corso...</span><ol id="errori-pt-list"></ol>');
		$('.errori-pt-box').draggable({
		    create: function( event, ui ) {
		        $(this).css({
		            right: "auto",
		            top: $(this).position().top,
		            left: $(this).position().left
		        });
		    }
		});
		$('.errori-pt-box').draggable('option', 'cancel', '.errori-pt-box-main');
		$('.errori-pt-box .icon-close').click(function() {
			$('.errori-pt-box').remove();
		});
	};
	
	if (mw.config.get("wgAction") == "view" && mw.config.get("wgCanonicalNamespace") != "Special") {
		var tattooDiv = '<div id="showWikiCodeTattoo">';
		tattooDiv += '<a id="showWikiCodeBtn" href="#" title="Mostra wikicode della pagina"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Nuvola_mimetypes_source.png/30px-Nuvola_mimetypes_source.png" /></a>';
		tattooDiv += '</div>';
		$('#content').append(tattooDiv);
       
		mw.util.addPortletLink(
			'p-tb',
			'#',
			'Mostra wikitesto',
			't-mostraWikicode',
			"Mostra il codice wiki della pagina"
		);
       
		//apre un box fixed in cui visualizzare il wikicode e ci aggiunge una barra e il wikicode
		$('#showWikiCodeBtn, #t-mostraWikicode').click(function(e) {
			e.preventDefault();
			if ($("#showWikiCodeBox").length > 0) {
				$('#delWikiCodeBtn').click();
			} else {
				showWikiCodeBox();
			}
		});
       
		if (mw.config.get("wgCanonicalNamespace") == 'Index') {
			$('.exportLinkContainer').append('<div class="exportLink"><a id="downloadWikiText" title="Scarica il testo wiki di tutte le pagine" class="external text">'+
				'<span><img src="//upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Tango_style_Wikipedia_Icon.svg/20px-Tango_style_Wikipedia_Icon.svg.png"></span>Wikitesto</a></div>');
			$('#downloadWikiText').click(function() {
				downloadWikitextFromNsPage(1, findLastPage(), false);
			});
			
			$('#indiceHeader').prepend('<button id="checkPtBtn" class="btn blue" title="Verifica il template Pt">Controlla Pt</button>');
			$('#checkPtBtn').click(function() {
				showPtErrors();
				downloadWikitextFromNsPage(1, findLastPage(), true);
			});
		}
    }
});