Utilisateur:Escargot bleu/Gadget-Evaluation.js

Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/* adapté de [[MediaWiki:Gadget-Evaluation.js]] (version du 12 septembre 2008) par Chphe
* {{Projet:JavaScript/Script|Evaluation}}
*/

//<source lang="javascript">//<pre><nowiki>

/* jshint laxbreak: true */
/* globals mw, $ */

if ( mw.config.get( 'wgNamespaceNumber' ) === 0 && mw.config.get( 'wgAction' ) === 'view' ) {
	mw.loader.using( [ 'mediawiki.util', 'mediawiki.api', 'user' ], function () {
		$( ev_addEvalTab );
	} );
}

function ev_addEvalTab( $ ) {
	var portletLink = mw.util.addPortletLink( 'p-cactions', '#', 'Évaluer' );

	$( portletLink ).click( function ( e ) {
		e.preventDefault();
		ev_launchEval();
	} );

	if ( window.alwaysEval ) {
		ev_launchEval();
	}
}

function ev_launchEval() {
	if ( mw.util.getParamValue( 'printable' ) === 'yes' ) {
		/* version imprimable */
		return;
	}

	var EvalDiv = $('#EvalDiv');
	if (!EvalDiv.length) {
	    EvalDiv = $('<div>', {
	        id: 'EvalDiv',
	        class: 'center'
	    });
	    $('#mw-content-text').prepend(EvalDiv);
	}

	// Initialisation des variables
	if ( typeof window.initEvalProjectNames !== "undefined" ) {
		window.initEvalProjectNames();
	} else {
		window.evalProjectNames = [];
	}

	window.evaluation_portails = [];

	window.evaluation_multiprojets = {};
	window.evaluation_multiprojets.project = [];
	window.evaluation_multiprojets.portailPresent = [];
	window.evaluation_multiprojets.importance = [];
	window.evaluation_multiprojets.state = [];
	window.evaluation_multiprojets.avancement_global = "?";
	window.evaluation_multiprojets.autres = {}; // pour ramasser le reste (WP1.0, todo, wikiconcours, ...)
	
	window.estHomonymie = false;
	
	// 1 - Détermination du statut ou non d'homonymie
	EvalDiv.html("Détermination du statut d'homonymie...");
	new mw.Api()
	.get({
		action: 'query', 
		format: 'json' ,
		titles: mw.config.get( 'wgPageName' ),
		prop: 'pageprops',
		ppprop: 'disambiguation',
		formatversion: 2
	})
	.done( function ( results ) {
		window.estHomonymie = 'pageprops' in results.query.pages[0];
		ev_ExtractPortail();
	});
}

function ev_ExtractPortail() { // 2 - Détermination de la liste des portails liés par les catégories
	$('#EvalDiv').html("Détermination des portails liés...");
	
	var liste_remplacements = {
		"Allemagne": "Monde germanique", "Autriche": "Monde germanique", "Liechtenstein": "Monde germanique",
		"Révolution française": "Révolution et Empire", "Premier Empire": "Révolution et Empire",
		"Arts martiaux et sports de combat": "Arts martiaux",
		"Monde celtique": "Celtes",
		"Lacs et cours d'eau": "Cours d'eau",
		"Canidés": "Cynophilie",
		"Vexillologie": "Drapeaux",
		"Égypte antique": "Egyptopedia",
		"Grèce antique": "Hellenopedia",
		"Intercommunalités de France": "Intercommunalités françaises",
		"Iran et monde iranien": "Iran",
		"Arménie/Monastères arméniens": "Monastères arméniens",
		"Motocyclette": "Moto",
		"Bois et forêt": "Sylvipédia"
	};
	var reg_portail = /^Catégorie:Portail:([^\/]*)/;
	
	new mw.Api()
	.get({
		action: 'query',
		format: 'json',
		prop: 'categories',
		titles: mw.config.get( 'wgPageName' ),
		clshow: "hidden",
		cllimit: 500,
		formatversion: 2
	})
	.done( function ( results ) {
		var categories = results.query.pages[0].categories;
		if (categories) {
			for (var i = 0; i < categories.length; i++) {
				var m = reg_portail.exec( categories[i].title );
				if (m !== null && m[1]){
					if (m[1] in liste_remplacements) {
						window.evaluation_portails.push(liste_remplacements[m[1]]);
					} else {
						window.evaluation_portails.push(m[1]);
					}
				}
			}
		}
		if (window.evaluation_portails.length !== 0) {
			ev_ExtractPortailSansProjet ();
		} else if (window.estHomonymie) {
				$('#EvalDiv').html("Les pages d'homonymie sans portail associé ne doivent pas être évaluées.");
		} else {
			ev_ExtractEvaluation();
		}
	});
}

function ev_ExtractPortailSansProjet () { // 3 - Retrait des portails sans projet associé de la liste
	$('#EvalDiv').html("Recherche des projets d'évaluation associés aux portails liés...");

	var regex = /Catégorie:Évaluation des articles du projet (.*)/;
	
	new mw.Api()
	.get({
		action: 'query',
		format: 'json',
		prop: 'info',
		titles: 'Catégorie:Évaluation des articles du projet ' + window.evaluation_portails.join('|Catégorie:Évaluation des articles du projet '),
		formatversion: 2
	})
	.done( function ( results ) {
		var pages = results.query.pages;
		if (pages !== undefined) {
			for (var j = 0; j < pages.length; j++) {
				var match = regex.exec(pages[j].title);
				if (match !== null && 'missing' in pages[j]) {
					var idx = window.evaluation_portails.indexOf( match[1] );
					if (idx !== -1) {
						window.evaluation_portails.splice(idx, 1);
					}
				}
			}
		}
		ev_ExtractEvaluation();
	});
}

function ev_ExtractEvaluation() { // 4 - Lecture du modèle Wikiprojet
	$('#EvalDiv').html("Interrogation de la page de discussion...");

	new mw.Api()
	.get({
		action: 'query',
		titles: mw.config.get( 'wgFormattedNamespaces' )[1] + ':' + mw.config.get( 'wgPageName' ),
		prop: 'revisions',
		rvprop: 'content',
		rvslots: 'main',
		formatversion: 2
	})
	.done( function ( results ) {
		var page = results.query.pages[0];
		window.evaluation_multiprojets.pdd_existe = !page.missing;
		if ( !page.missing ) {
			var pageContent = page.revisions[0].slots.main.content;
			
			var reg_modele_multiprojet = /{{[wW]ikiprojet\s*\|([^{]*(({{[^{}]+?}}[^{]*?)*?)?)}}/;
			var m = reg_modele_multiprojet.exec( pageContent );
			if ( m ) {
				var reg_pipe = /({{[^}]*}})/g;
				var n = m[1].replace(reg_pipe, function (match) { return match.replace(/\|/g, "{{subst:!}}")});
				var tab = n.split( "|" );
				var i = 0;
				var ind = window.evaluation_multiprojets.project.length;
				while ( i < tab.length ) {
					var t = tab[i].split( "=" );
					if ( t.length === 2 ) {
						if ( t[0].trim() === "avancement" ) {
							
							var avanc = t[1].trim().toLowerCase();
							var clean_avancement = {
							    "adq": "AdQ",
							    "ba": "BA",
							    "a": "A",
							    "b": "B",
							    "bd": "BD",
							    "ébauche": "ébauche",
							    "e": "ébauche",
							    "homonymie": "homonymie"
							};
							window.evaluation_multiprojets.avancement_global = clean_avancement[avanc] || "?";
							
						} else {
							window.evaluation_multiprojets.autres[t[0]] = t[1].trim();
						}
					} else if ( t.length === 1 ) {
						var _proj = tab[i].trim();
						window.evaluation_multiprojets.project[ind] = _proj;
						if ( i === tab.length - 1 ) alert( "Erreur de lecture du modèle {{Wikiprojet}}" );
						var imp = tab[i + 1].trim().toLowerCase();
						if ( imp === "faible" || imp === "moyenne" || imp === "élevée" || imp === "maximum" ) {
							window.evaluation_multiprojets.importance[ind] = imp;
						} else {
							window.evaluation_multiprojets.importance[ind] = "?";
						}
						window.evaluation_multiprojets.state[ind] = true;
						window.evaluation_multiprojets.portailPresent[ind] = false;
						ind++;
						i++;
					}
					i++;
				}
			}
		}
		if (window.evaluation_multiprojets.project.length !== 0) {
			ev_ResolveAlias();
		} else {
			ev_drawEvaluation();
		}
	});
}

function ev_ResolveAlias() { // 5 - Résolution des alias via {{Wikiprojet/alias}}
	$('#EvalDiv').html("Résolution des alias de projet...");

	new mw.Api()
	.get({
		action: 'parse',
		format: 'json',
		text: "{{Wikiprojet/alias|projet=" + window.evaluation_multiprojets.project.join('}};{{Wikiprojet/alias|projet=') + "}}",
		contentmodel: 'wikitext',
		rvslots: 'main'
	})
	.done( function ( results ) {
		var parsedContent = results.parse.text['*'];
		var match = parsedContent.match(/<p>((.|\n)*?)<\/p>/);
		if (match) {
			var projetsResolu = match[1].split(";");
			for (var i = 0; i < projetsResolu.length; i++) {
				window.evaluation_multiprojets.project[i] = projetsResolu[i].trim().replace(/^[\n\r]+|[\n\r]+$/g, '');
			}
		}
		ev_drawEvaluation();
	});
}

function ev_Radiobox(id, selected, n, prop, value) {
    var inputElement = $("<input>")
        .attr("type", "radio")
        .attr("name", id + "_mp");

    if (prop === "avancement_global") {
        inputElement.on("click", function () {
            window.evaluation_multiprojets.avancement_global = value;
        });
    } else {
        inputElement.on("click", function () {
            window.evaluation_multiprojets.importance[n] = value;
            window.evaluation_multiprojets.state[n] = true;
            $( "#evc_" + n).prop("checked", true);
      });
    }

    if (selected) {
        inputElement.attr("checked", true);
    }

    return inputElement;
}

function ev_drawEvaluation() {
	// Ajout des portails présents à la liste des projets
	
	for ( var i = 0; i < window.evaluation_portails.length; i++ ) {
		if ( window.evaluation_multiprojets.project.indexOf( window.evaluation_portails[i] ) !== -1 ) {
			window.evaluation_multiprojets.portailPresent[window.evaluation_multiprojets.project.indexOf( window.evaluation_portails[i])] = true;
		} else if (typeof window.noPortalEvals === "undefined" || !window.noPortalEvals) {
			var t = window.evaluation_multiprojets.project.length;

			window.evaluation_multiprojets.project[t] = window.evaluation_portails[i];
			window.evaluation_multiprojets.importance[t] = "?";
			window.evaluation_multiprojets.state[t] = false;
			window.evaluation_multiprojets.portailPresent[t] = true;
		}
	}
	
	// Ajout des projets notés dans le common.js de l'utilisateur à la liste des projets à afficher
	
	for ( var j = 0; j < window.evalProjectNames.length; j++ ) {
		if ( window.evaluation_multiprojets.project.indexOf( window.evalProjectNames[j] ) === -1 ) {
			var u = window.evaluation_multiprojets.project.length;

			window.evaluation_multiprojets.project[u] = window.evalProjectNames[j];
			window.evaluation_multiprojets.importance[u] = "?";
			window.evaluation_multiprojets.state[u] = false;
			window.evaluation_multiprojets.portailPresent[u] = false;
		}
	}

	var av = window.evaluation_multiprojets.avancement_global;
	
	// Construction de l'outil d'évaluation

	var tab = $("<table>")
		.addClass('wikitable')
		.css({
		    'text-align': 'center',
		    'font-size': '90%'
		})
		.append(
			$('<tr>').append(
				$('<td>')
				    .html('<b>Avancement commun</b>')
				    .attr('rowSpan', 2),
				$('<td>')
					.html('<b>AdQ</b>')
					.css('background-color', '#6699FF'),
				$('<td>')
					.html('<b>BA</b>')
					.css('background-color', '#66FF66'),
				$('<td>')
					.html('<b>A</b>')
					.css('background-color', '#66FFFF'),
				$('<td>')
					.html('<b>B</b>')
					.css('background-color', '#FFFF66'),
				$('<td>')
					.html('<b>BD</b>')
					.css('background-color', '#FFAA66'),
				$('<td>')
					.html('<b>Ébauche</b>')
					.css('background-color', '#FF6666'),
				$('<td>')
					.html('<b>?</b>')
					.css('background-color', '#F8F8F8')
			),
			$('<tr>').append(
				$('<td>')
					.html( ev_Radiobox( "ag", av === "AdQ", null, "avancement_global", "AdQ" ) ),
				$('<td>')
					.html( ev_Radiobox( "ag", av === "BA", null, "avancement_global", "BA" ) ),
				$('<td>')
					.html( ev_Radiobox( "ag", av === "A", null, "avancement_global", "A" ) ),
				$('<td>')
					.html( ev_Radiobox( "ag", av === "B", null, "avancement_global", "B" ) ),
				$('<td>')
					.html( ev_Radiobox( "ag", av === "BD", null, "avancement_global", "BD" ) ),
				$('<td>')
					.html( ev_Radiobox( "ag", av === "ébauche", null, "avancement_global", "ébauche" ) ),
				$('<td>')
					.html( ev_Radiobox( "ag", av === "?", null, "avancement_global", "?" ) )
			)
	);
	
	if (window.estHomonymie) {
	    tab.find('tr')
	    	.first().append(
		        $('<td>')
		            .html('<b>Homonymie</b>')
		            .css('background-color', '#66FF66')
			)
		    .eq(1).append(
		        $('<td>')
		            .html( ev_Radiobox( "ag", av === "homonymie", null, "avancement_global", "homonymie" ) )
	    	);
	}

	var tab2 = $("<table>")
		.addClass('wikitable')
		.css({
		    'text-align': 'center',
		    'font-size': '90%'
		})
		.append(
			$('<tr>').append(
				$('<td>')
				    .html('<b>Projet</b>')
					.css('background-color', '#F8F8F8'),
				$('<td>')
					.html('<b>Évaluation</b>')
					.css('background-color', '#F8F8F8'),
				$('<td>')
					.html('<b>Portail présent</b>')
					.css('background-color', '#F8F8F8'),
				$('<td>')
					.html('<b>Maximum</b>')
					.css('background-color', '#FF00FF'),
				$('<td>')
					.html('<b>Élevée</b>')
					.css('background-color', '#FF88FF'),
				$('<td>')
					.html('<b>Moyenne</b>')
					.css('background-color', '#FFCCFF'),
				$('<td>')
					.html('<b>Faible</b>')
					.css('background-color', '#FFEEFF'),
				$('<td>')
					.html('<b>?</b>')
					.css('background-color', '#F8F8F8')
			)
	);

	for ( var k = 0; k < window.evaluation_multiprojets.project.length; k++ ) {
		var project = window.evaluation_multiprojets.project[k];
		var im = window.evaluation_multiprojets.importance[k];
		tab2.append(
			$('<tr>').append(
			    $('<td>').append(
			        $('<a>')
			            .attr('href', '/wiki/Projet:' + encodeURIComponent(project))
			            .attr('title', 'Projet:' + project)
			            .text(project)
			    ),
			    $('<td>').append(
			        $('<input>', {
			            id: 'evc_' + k,
			            type: 'checkbox',
			            onclick: 'window.evaluation_multiprojets.state[' + k + ']=this.checked',
			            checked: window.evaluation_multiprojets.state[k]
			        })
			    ),
			    $('<td>').append(
			        $('<input>', {
			            type: 'checkbox',
			            onclick: 'window.evaluation_multiprojets.portailPresent[' + k + ']=this.checked',
			            checked: window.evaluation_multiprojets.portailPresent[k],
        				disabled: true
			        })
			    ),
				$('<td>')
					.html( ev_Radiobox( k + "i", im === "maximum", k, "importance", "maximum" ) ),
				$('<td>')
					.html( ev_Radiobox( k + "i", im === "élevée", k, "importance", "élevée" ) ),
				$('<td>')
					.html( ev_Radiobox( k + "i", im === "moyenne", k, "importance", "moyenne" ) ),
				$('<td>')
					.html( ev_Radiobox( k + "i", im === "faible", k, "importance", "faible" ) ),
				$('<td>')
					.html( ev_Radiobox( k + "i", im === "?", k, "importance", "?" ) )
			)
		);
	}
	
	// Création du champ de recherche et du bouton pour ajouter un projet manuellement
	
	var cont_addProject = $("<div>").attr("id", "addProject");
	var lbl_addProject = $("<label>").text("Ajouter un projet : ");
	var input_addProject = $("<input>").attr({
	    type: "text",
	    id: "input_addProject",
//	    size: "64"
	})
	.on('keyup', function (e) {
        if (e.key === 'Enter' || e.keyCode === 13) {
            ev_addProject();
        }
    });
    mw.loader.using(["jquery.ui"], function () {input_addProject.autocomplete({source: ev_autocomp})});
	var btn_addProject = $("<button>", {
	    text: "Ajouter",
	    id: "btn_addProject"
	}).click(ev_addProject);
	cont_addProject.append(lbl_addProject, input_addProject, btn_addProject);
	
	// Bouton de sauvegarde des modifications
	
	var btn_setEvaluation = $("<button>", {
	    text: "Exporter cette évaluation vers la page de discussion",
	    id: "EvalButton"
	}).click(ev_setEvaluation);

	// Ajout de tous les éléments à la page

	$( '#EvalDiv' )
		.empty()
		.append( tab, tab2, cont_addProject, btn_setEvaluation );
}

function ev_autocomp (request, response) {
    if (/[{}|<>\[\]]/.test(request.term)) {
        response([]);
        return;
    }
    var commonPrefix = 'Évaluation des articles du projet ';
    var prefix = commonPrefix + request.term.substr(0, 1).toUpperCase() + request.term.substr(1);
    var query = {format: 'json', action: 'query', list: 'allpages', apprefix: prefix, apnamespace: 14, rawcontinue: ''};
    $.getJSON(mw.util.wikiScript('api'), query, function (obj) {
        var projets = [];
        for (var i = 0; i < obj.query.allpages.length; i++) {
            var category = obj.query.allpages[i].title;
            projets.push(category.substr(category.indexOf(':') + 1 + commonPrefix.length));
        }
        if (projets.length == 1 && projets[0] == request.term) {
            response([]);
        } else {
            response(projets);
        }
    });
}

function ev_addProject() {
	var val = $( '#input_addProject' ).val();
    if (val && val !== "") {
		if ( window.evaluation_multiprojets.project.indexOf( val ) !== -1 ) {
			window.evaluation_multiprojets.state[window.evaluation_multiprojets.project.indexOf( val )] = true;
    	} else {
		    window.evaluation_multiprojets.project.push(val);
		    window.evaluation_multiprojets.importance.push("?");
		    window.evaluation_multiprojets.state.push(true);
		    window.evaluation_multiprojets.portailPresent.push(false);
    	}
		ev_drawEvaluation();
    }
}

function ev_setEvaluation() {
	document.getElementById( 'EvalButton' ).disabled = true;
	var talkpage = mw.config.get( 'wgFormattedNamespaces' )[1] + ':' + mw.config.get( 'wgPageName' );
	var summary = "[[Projet:Scripts et gadgets/Notices/Evaluation|Évaluation]]: Multiprojet (" + window.evaluation_multiprojets.avancement_global + ")";
	for ( var i = 0; i < window.evaluation_multiprojets.project.length; i++ ) {
		if ( window.evaluation_multiprojets.state[i] ) {
			summary += " " + window.evaluation_multiprojets.project[i] + "|" + window.evaluation_multiprojets.importance[i];
		}
	}
	summary += ")";
	if ( window.evaluation_multiprojets.pdd_existe ) {
		new mw.Api()
			.edit( talkpage, function ( revision ) {
				return {
					text: ev_processText( revision.content ),
					summary: summary
				};
			} )
			.done( function ( ) {
				document.getElementById( 'EvalButton' ).disabled = false;
				mw.notify('Évaluation mise à jour avec succès.', { type: 'success'});
			});
	} else {
		new mw.Api()
			.create( talkpage, { summary: summary }, ev_processText( '' ) )
			.done( function ( ) {
				document.getElementById( 'EvalButton' ).disabled = false;
				mw.notify('Évaluation mise à jour avec succès.', { type: 'success'});
			});
	}
}

function ev_processText( text ) {
	
	// Mise à jour des paramètres du modèle
	
	var regtxt = /\{\{[wW]ikiprojet\s*\|[^\}]*\}\}/;
	var newtxt = "{{Wikiprojet";
	var regtodo = /\{\{([tT]odo\|?\*?|[àÀ] faire\|?\*?)\}\}/;
	var ok = false;
	var i;
	for ( i = 0; i < window.evaluation_multiprojets.project.length; i++ ) {
		if ( window.evaluation_multiprojets.state[i] ) {
			newtxt += "\n|{{subst:Wikiprojet/alias|projet="
				+ window.evaluation_multiprojets.project[i]
				+ "}}|"
				+ window.evaluation_multiprojets.importance[i];
			ok = true;
		}
	}
	ok = ok || ( window.evaluation_multiprojets.avancement_global !== "?" );
	newtxt += "\n|avancement=" + window.evaluation_multiprojets.avancement_global;

	for ( i in window.evaluation_multiprojets.autres ) {
		newtxt += "\n|" + i + "=" + window.evaluation_multiprojets.autres[i];
	}
	newtxt += "\n}}";

	if ( ok ) {
		if ( regtxt.test( text ) ) {
			text = text.replace( regtxt, newtxt );
		} else {
			text = newtxt + "\n" + text;
		}
		text = text.replace( regtodo, "" );
	}
	
	// Modèle {{Traduit de}} remis en tête de page de discussion
	
	var reg = /(\{\{[tT]raduit de\s*\|[^}]*\}\})/;
	var m = reg.exec( text );
	if ( m ) {
		var left = RegExp.leftContext;
		var right = RegExp.rightContext;
		text = m[1]
			+ "\n"
			+ left.replace( /\s+$/, '' )
			+ "\n"
			+ right.replace( /^\s+/, '' );
	}
	return text;
}
//</nowiki></pre></source>