Utilisateur:Philippe rogez/Gadget-Evaluation.js

Une page de Wikipédia, l'encyclopédie libre.
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}}
* rajouter l'onglet suivi des users
*
*/
//<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();
	} );
/* test de la variable positionnée dans le common.js de l'utilisateur */
	if ( window.alwaysEval ) {
		ev_launchEval();
	}
}

//initialise les variables 
/* et ramasse les projets à ajouter, inséré dans le common.js de l'utilisateur...*/
function ev_initVars() {
	if ( typeof window.initEvalProjectNames !== "undefined" ) {
		window.initEvalProjectNames();
	} else {
		window.evalProjectNames = [];
	}

	window.evaluation_multiprojets = {};
	window.evaluation_multiprojets.project = [];
	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, ...)
}

function ev_launchEval() {
	if ( mw.util.getParamValue( 'printable' ) === 'yes' ) {
		/* version imprimable */
		return;
	}
	
		ev_initVars();
/* pour page main */
	var EvalPor = document.getElementById( 'EvalPor' );

	if ( !EvalPor ) {
		EvalPor = document.createElement( 'div' );
		EvalPor.id = "EvalPor";
		EvalPor.align = "center";
		$( '#mw-content-text' ).prepend( EvalPor );
	}

	EvalPor.innerHTML = "Interrogation de la page main...";

/* namespace(0) = main */
	var params = {
		action: 'query',
		titles: mw.config.get( 'wgFormattedNamespaces' )[0] + ':' + mw.config.get( 'wgPageName' ),
		prop: 'revisions',
		rvprop: 'content',
		rvslots: 'main',
		formatversion: 2,
	};
	
	new mw.Api()
		.get( params )
		.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;
				ev_ExtractPortail( pageContent );
			}
/*			ev_AddPortailProjects(); */
		} );
	
/* pour page de discussion */	
	var EvalDiv = document.getElementById( 'EvalDiv' );

	if ( !EvalDiv ) {
		EvalDiv = document.createElement( 'div' );
		EvalDiv.id = "EvalDiv";
		EvalDiv.align = "center";
		$( '#mw-content-text' ).prepend( EvalDiv );
	}

	EvalDiv.innerHTML = "Interrogation de la page de discussion...";		
/* namespace(1) = discussion */
	var params = {
		action: 'query',
		titles: mw.config.get( 'wgFormattedNamespaces' )[1] + ':' + mw.config.get( 'wgPageName' ),
		prop: 'revisions',
		rvprop: 'content',
		rvslots: 'main',
		formatversion: 2,
	};

	new mw.Api()
		.get( params )
		.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;
				ev_ExtractEvaluation( pageContent );
			}
			ev_AddMyProjects();
			ev_drawEvaluation();
		} );
}

function ev_addCell( line, html, bgcolor, rowSpan ) {
	var cell = line.insertCell();
	cell.innerHTML = html;

	if ( bgcolor ) {
		cell.style.backgroundColor = "#" + bgcolor;
	}
	if ( rowSpan ) {
		cell.rowSpan = rowSpan;
	}

	return cell;
}

function ev_getRadioboxHtml( id, selected, n, prop, value ) {
	if ( prop === "avancement_global" ) {
		return "<input onclick='window.evaluation_multiprojets.avancement_global=\""
			+ value
			+ "\"'  name='"
			+ id
			+ "_mp' type='radio'"
			+ ( selected ? " checked='true'/>" : "/>" );
	} else {
		return "<input onclick='window.evaluation_multiprojets."
			+ prop
			+ "["
			+ n
			+ "]=\""
			+ value
			+ "\"'  name='"
			+ id
			+ "_mp' type='radio'"
			+ ( selected ? " checked='true'/>" : "/>" );
	}
}

function ev_addEvalLine( tab, project, im, state, n ) {
	var line = tab.insertRow();

	ev_addCell(
		line,
		'<a title="Projet:'
			+ mw.html.escape( project )
			+ '" href="/wiki/Projet:'
			+ encodeURIComponent( project )
			+ '">'
			+ project
			+ "</a>"
	);
	ev_addCell(
		line,
		"<input onclick='window.evaluation_multiprojets.state["
			+ n
			+ "]=this.checked' type='checkbox'"
			+ ( state ? " checked='true'/>" : "/>" )
	);

	ev_addCell( line, ev_getRadioboxHtml( n + "i", im === "maximum", n, "importance", "maximum" ) );
	ev_addCell( line, ev_getRadioboxHtml( n + "i", im === "élevée", n, "importance", "élevée" ) );
	ev_addCell( line, ev_getRadioboxHtml( n + "i", im === "moyenne", n, "importance", "moyenne" ) );
	ev_addCell( line, ev_getRadioboxHtml( n + "i", im === "faible", n, "importance", "faible" ) );
	ev_addCell( line, ev_getRadioboxHtml( n + "i", im === "?", n, "importance", "?" ) );
}

function ev_drawEvaluation() {
	var line;

	var tab = document.createElement( "table" );
	tab.className = 'wikitable';
	tab.style.textAlign = 'center';
	tab.style.fontSize = '90%';

	line = tab.insertRow();
	ev_addCell( line, "<b>Avancement commun</b>", null, 2 );
	ev_addCell( line, "<b>AdQ</b>", "6699FF" );
	ev_addCell( line, "<b>BA</b>", "66FF66" );
	ev_addCell( line, "<b>A</b>", "66FFFF" );
	ev_addCell( line, "<b>B</b>", "FFFF66" );
	ev_addCell( line, "<b>BD</b>", "FFAA66" );
	ev_addCell( line, "<b>Ébauche</b>", "FF6666" );
	ev_addCell( line, "<b>Homonymie</b>", "66FF66" );
	ev_addCell( line, "<b>?</b>", "F8F8F8" );

	line = tab.insertRow();
	var av = window.evaluation_multiprojets.avancement_global;
	ev_addCell( line, ev_getRadioboxHtml( "ag", av === "AdQ", null, "avancement_global", "AdQ" ) );
	ev_addCell( line, ev_getRadioboxHtml( "ag", av === "BA", null, "avancement_global", "BA" ) );
	ev_addCell( line, ev_getRadioboxHtml( "ag", av === "A", null, "avancement_global", "A" ) );
	ev_addCell( line, ev_getRadioboxHtml( "ag", av === "B", null, "avancement_global", "B" ) );
	ev_addCell( line, ev_getRadioboxHtml( "ag", av === "BD", null, "avancement_global", "BD" ) );
	ev_addCell( line, ev_getRadioboxHtml( "ag", av === "ébauche", null, "avancement_global", "ébauche" ) );
	ev_addCell( line, ev_getRadioboxHtml( "ag", av === "Homonymie", null, "avancement_global", "Homonymie" ) );
	ev_addCell( line, ev_getRadioboxHtml( "ag", av === "?", null, "avancement_global", "?" ) );

	var tab2 = document.createElement( "table" );
	tab2.className = 'wikitable';
	tab2.style.textAlign = 'center';
	tab2.style.fontSize = '90%';

	line = tab2.insertRow();
	ev_addCell( line, "<b>Projet</b>", "F8F8F8" );
	ev_addCell( line, "<b>Bandeau présent</b>", "F8F8F8" );
	ev_addCell( line, "<b>Maximum</b>", "FF00FF" );
	ev_addCell( line, "<b>Élevée</b>", "FF88FF" );
	ev_addCell( line, "<b>Moyenne</b>", "FFCCFF" );
	ev_addCell( line, "<b>Faible</b>", "FFEEFF" );
	ev_addCell( line, "<b>?</b>", "F8F8F8" );

	for ( var i = 0; i < window.evaluation_multiprojets.project.length; i++ ) {
		ev_addEvalLine(
			tab2,
			window.evaluation_multiprojets.project[i],
			window.evaluation_multiprojets.importance[i],
			window.evaluation_multiprojets.state[i],
			i,
			true
		);
	}

	var button = document.createElement( "button" );
	button.textContent = "Exporter cette évaluation vers la page de discussion";
	button.onclick = ev_setEvaluation;
	button.id = 'EvalButton';

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

function ev_AddMyProjects() {
	for ( var i = 0; i < window.evalProjectNames.length; i++ ) {
		if ( window.evaluation_multiprojets.project.indexOf( window.evalProjectNames[i] ) === -1 ) {
			var t = window.evaluation_multiprojets.project.length;

			var _proj = window.evalProjectNames[i].trim();
			var _proj = _proj.toLowerCase();
			window.evaluation_multiprojets.project[t] = _proj;
			window.evaluation_multiprojets.importance[t] = "?";
			window.evaluation_multiprojets.state[t] = false;
		}
	}
}

/* pour reprise des portails/projets/wikiprojets */
/* phr le 3 juin 2023 */
function ev_AddPortailProjects() {
	for ( var i = 0; i < window.evalProjectNames.length; i++ ) {
		if ( window.evaluation_multiprojets.project.indexOf( window.evalProjectNames[i] ) === -1 ) {
			var t = window.evaluation_multiprojets.project.length;

			window.evaluation_multiprojets.project[t] = window.evalProjectNames[i];
			window.evaluation_multiprojets.importance[t] = "?";
			window.evaluation_multiprojets.state[t] = false;
		}
	}
}

function ev_ExtractEvaluation( discussion ) {
	var reg_modele_multiprojet = /{{[wW]ikiprojet\s*\|([^}]*)}}/;
	var m = reg_modele_multiprojet.exec( discussion );
	if ( m ) {
		var tab = m[1].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" ) {
					window.evaluation_multiprojets.avancement_global = ev_cleanAvancement( t[1].trim() );
				} 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.toLowerCase();
				if ( i === tab.length - 1 ) alert( "Erreur de lecture du modèle {{Wikiprojet}}" );
				window.evaluation_multiprojets.importance[ind] = ev_cleanImportance( tab[i + 1].trim() );
				window.evaluation_multiprojets.state[ind] = true;
				ind++;
				i++;
			}
			i++;
		}
	}
}
function ev_ExtractPortail( discussion ) {
	var reg_modele_portailprojet = /{{[pP]ortail\s*\|([^}]*)}}/;
	var m = reg_modele_portailprojet.exec( discussion );
	if ( m ) {
		var tab = m[1].split( "|" );
		var i = 0;
		var ind = window.evaluation_multiprojets.project.length;
		while ( i < tab.length ) {
			var t = tab[i].split( "=" );
				if ( t.length === 1 ) {
				var _proj = tab[i].trim().toLowerCase();
				window.evaluation_multiprojets.project[ind] = _proj.toLowerCase();
				if ( i === tab.length ) alert( "Erreur de lecture du modèle {{Portail}}" );
				window.evaluation_multiprojets.state[ind] = true;
				ind++;
			}
			i++;
		}
	}
}

function ev_cleanAvancement( val ) {
	val = val.toLowerCase();
	if ( val === "adq" ) { return "AdQ"; }
	if ( val === "ba" ) { return "BA"; }
	if ( val === "a" ) { return "A"; }
	if ( val === "b" ) { return "B"; }
	if ( val === "bd" ) { return "BD"; }
	if ( val === "ébauche" || val === "e" ) { return "ébauche"; }
	if ( val === "homonymie"  ) { return "Homonymie"; }
	return "?";
}


function ev_cleanImportance( val ) {
	val = val.toLowerCase();
	if ( val === "maximum" || val === "maximale" ) { return "maximum"; }
	if ( val === "élevée" ) { return "élevée"; }
	if ( val === "moyenne" ) { return "moyenne"; }
	if ( val === "faible" ) { return "faible"; }

	return "?";
}
/* */
/* Traitement du bouton "Exporter cette évaluation vers la page de discussion" */
/* */
function ev_setEvaluation() {
	document.getElementById( 'EvalButton' ).disabled = true;
	var talkpage = mw.config.get( 'wgFormattedNamespaces' )[1] + ':' + mw.config.get( 'wgPageName' );
	var summary = '[[MediaWiki:Gadget-Evaluation.js|Évaluation]]: ' + ev_getSummary_multiprojects();
	if ( window.evaluation_multiprojets.pdd_existe ) {
		new mw.Api()
			.edit( talkpage, function ( revision ) {
				return {
					text: ev_processText( revision.content ),
					summary: summary
				};
			} )
			.done( ev_doneCallback );
	} else {
		new mw.Api()
			.create( talkpage, { summary: summary }, ev_processText( '' ) )
			.done( ev_doneCallback );
	}
}

function ev_processText( text ) {
	text = ev_suppr_anc_eval( text );
	text = ev_process_multiprojects( text );
	text = ev_remise_en_tete( text );
	return text;
}

function ev_doneCallback() {
	document.getElementById( 'EvalButton' ).disabled = false;
}
/* construction du libellé pour l'historique avec un lien vers outil Evaluation */
function ev_getSummary_multiprojects() {
	var summary = " 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];
		}
	}
	return summary + ")";
}
function ev_suppr_anc_eval( text ) {
	var regtxt = /\{\{([W|w]ikiprojet [^\}|])[^\}]*\}\}/g;
	return text.replace( regtxt, '' );
}

function ev_process_multiprojects( text ) {
	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, "" );
	}
	return text;
}
function ev_remise_en_tete( text ) {
	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>