Aller au contenu

Module:Wikiprojet

Cette page est protégée.
Une page de Wikipédia, l'encyclopédie libre.

 Documentation[voir] [modifier] [historique] [purger]

Utilisation

Ce module génère le tableau d'évaluation des bandeaux {{Wikiprojet}}. Il est conçu pour éviter l'imbrication de tableaux HTML.

Il fait pour le moment appel aux modèles {{Wikiprojet/alias}}, {{Wikiprojet/image}} et {{Wikiprojet/extra}}. Il serait préférable de transférer le contenu de ces modèles dans un sous-module, mais c'est fastidieux à faire et cela n’apporterait pas grand chose au final, ce module n'étant utilisé qu'une fois par page.

Fonctions exportables

  • projet( frame ) – retourne une introduction avec la liste des projets, et le tableau d'évaluation de l'avancement et l'importance de l'article pour chaque projet.

Voir aussi

-- Ce module implémente [[Modèle:Wikiprojet/Projet]], pour avoir une structure html plus simple.

local p = {}

local dataAvancement = {
	default = {
		nom = 'inconnu',
		couleur = '#666666',
		extraCSS = 'color:#fff; white-space:nowrap;',
		texte = 'À évaluer',
	},
	adq = {
		nom = 'AdQ',
		couleur = '#6699ff',
		extraCSS = 'color:#000;',
		texte = '[[Fichier:Article de qualité.svg|14px|AdQ|alt=]] <abbr class="abbr" title="Article de qualité">AdQ</abbr>',
	},
	ba = {
		nom = 'BA',
		couleur = '#66ff66',
		extraCSS = 'color:#000;',
		texte = '[[Fichier:Bon article.svg|14px|BA|alt=]] <abbr class="abbr" title="Bon article">BA</abbr>',
	},
	a = {
		nom = 'A',
		couleur = '#66ffff',
		extraCSS = 'color:#000;',
		texte = '<abbr class="abbr" title="Article avancé">A</abbr>',
	},
	b = {
		nom = 'B',
		couleur = '#ffff66',
		extraCSS = 'color:#000;',
		texte = '<abbr class="abbr" title="Article bien construit">B</abbr>',
	},
	bd = {
		nom = 'BD',
		couleur = '#ffaa66',
		extraCSS = 'color:#000;',
		texte = 'Bon\194\160début',
	},
	['ébauche'] = {
		nom = 'ébauche',
		couleur = '#ff6666',
		extraCSS = 'color:#000;',
		texte = 'Ébauche',
	},
	homonymie = {
		nom = 'homonymie',
		couleur = '#66ff66',
		extraCSS = 'color:#000;',
		texte = 'Homonymie',
	},
}
dataAvancement['bon début'] = dataAvancement.bd
dataAvancement.c = dataAvancement.bd
dataAvancement.d = dataAvancement.bd
dataAvancement.e = dataAvancement['ébauche']

local dataImportance = {
	default = {
		id = 0,
		nom = 'inconnue',
		couleur = '#666666',
		extraCSS = 'color:#fff; white-space:nowrap;',
		texte = 'À évaluer',
	},
	maximum = {
		id = 4,
		nom = 'maximum',
		couleur = '#ff00ff',
		extraCSS = 'color:#000;',
		texte = "Maximum",
	},
	['élevée'] = {
		id = 3,
		nom = 'élevée',
		couleur = '#ff88ff',
		extraCSS = 'color:#000;',
		texte = "Élevée",
	},
	moyenne = {
		id = 2,
		nom = 'moyenne',
		couleur = '#ffccff',
		extraCSS = 'color:#000;',
		texte = "Moyenne",
	},
	faible = {
		id = 1,
		nom = 'faible',
		couleur = '#ffeeff',
		extraCSS = 'color:#000;',
		texte = "Faible",
	},
}

local introduction = '<div class="intro-wikiprojet" style="margin-bottom:1em"><p>Cet article est indexé par %s %s.</p>'
	.. '<p>Les [[Projet:Accueil|projets]] ont pour but d’enrichir le contenu de Wikipédia en aidant à la coordination du travail des contributeurs. '
	.. 'Vous pouvez [%s modifier directement cet article] '
	.. 'ou visiter les pages de projets pour prendre conseil ou consulter la liste des tâches et des objectifs.</p></div>'
local lienProjet = '[[Projet:%s|%s]]'
local liensProjet = '<b>[[Projet:¤|¤]]</b> ([[Discussion Projet:¤|discussion]]'
	.. '\194\160• [[Projet:¤/Évaluation|critères]]'
	.. '\194\160• [[Projet:¤/Évaluation/Index|liste]]'
	.. '\194\160• [[Projet:¤/Évaluation/Statistiques détaillées|stats]]'
	.. '\194\160• [[Projet:¤/Évaluation/Historique|hist.]]'
	.. '\194\160• [[Projet:¤/Évaluation/Comité|comité]]'
	.. '\194\160• [[Projet:¤/Pages populaires|stats vues]])'
local chaineCategorie = "[[Catégorie:Article d\'avancement %s/Liste complète]][[Catégorie:%s d\'avancement %s]][[Catégorie:%s d\'importance %s]]%s"

local function switch( key, table )
	return table[key] or table['default']
end

local function analyseArgs( args )
	local newArgs = {
		[0] = {},  -- pour éviter une erreur sur i-1
		avancement = switch( mw.ustring.lower( args.avancement or '' ), dataAvancement ),
		nocat = ( args.nocat and args.nocat ~= '' ),
	}
	local frame = mw.getCurrentFrame()
	local i = 1
	while args[i] and mw.text.trim( args[i] ) ~= '' do
		local nomProjet = frame:expandTemplate{
			title = 'Wikiprojet/alias',
			args = { projet = args[i] }
		}
		local projet = {
			importance = switch( mw.ustring.lower( mw.text.trim( args[ i + 1 ] or '' ) ), dataImportance ),
			nom = nomProjet,
			image = frame:expandTemplate{
				title = 'Wikiprojet/image',
				args = { projet = nomProjet }
			},
			nomCategorie = 'Article du projet ' .. nomProjet,
			extraCategorie = frame:expandTemplate{
				title = 'Wikiprojet/extra',
				args = { projet = nomProjet }
			},
		}
		if projet.image == '' then
			local bandeau = require 'Module:Bandeau'
			local icone = bandeau.parametreEbauche( frame:newChild { args = { nomProjet, 'icone' } } )
			projet.image = icone or 'Emojione 2754.svg'
			projet.extraCategorie = projet.extraCategorie .. '[[Catégorie:Page avec image Wikiprojet déduite|' .. nomProjet .. ']]'
		end
		table.insert( newArgs, projet )
		i = i + 2
	end

	-- fonction de triage selon
	-- 1. importance
	-- 2. nom
	table.sort( newArgs, function ( a, b )
		if a.importance.id == b.importance.id then
			function normalize( value )
				value = mw.ustring.lower( value )
				value = mw.ustring.gsub( value, '[âéî]', {
					['â'] = 'a', -- Projet:Âge d'or de l'Islam...
					['é'] = 'e', -- Projet:Économie, Projet:États-Unis...
					['î'] = 'i', -- Projet:Île-de-France, Projet:Île de Man, Projet:Îles...
				} )
				return value
			end
			return normalize( a.nom ) < normalize( b.nom )
		end
		return a.importance.id > b.importance.id
	end )

	return newArgs
end

function p.introduction( args )
	local sp = 'le projet'
	if #args > 1 then
		sp = 'les projets'
	end
	local listeProjets = {}
	for i = 1, #args do
		local nom = args[i].nom
		table.insert( listeProjets, string.format( lienProjet, nom, nom ) )
	end
	return string.format( introduction,
		sp,
		mw.text.listToText( listeProjets ),
		mw.title.getCurrentTitle().subjectPageTitle:fullUrl( 'action=edit' )
	)
end

function p.tableauAvancement( args )
	local page = mw.title.getCurrentTitle()
	local pageName = page.text
	local frame = mw.getCurrentFrame()
	local titreAvancement = {
		default = '[[Projet:Évaluation/Avancement|Avancement]]',
		AdQ = '[[Wikipédia:Articles de qualité|Label]]',
		BA = '[[Wikipédia:Bons articles|Label]]',
	}
	local evalTable = mw.html.create( 'table' )
	evalTable
		-- le "border-collapse:separate" est pour la version mobile
		:cssText( 'background:var(--couleur-fond-gris-alternance, #ededed); color:inherit; width:100%; border-spacing:0; padding:0.4em 0.6em calc(0.4em + 2px); border:1px solid #a7d7f9; border-radius:10px; border-collapse:separate;' )
		:tag( 'caption' )
			:cssText( 'padding-bottom:5px;' )
			:wikitext( '[[Fichier:Fairytale bookmark half gold silverlight.png|20px|alt=]] <b>[[Projet:Évaluation|Évaluation]]</b> de l’article « <b>' )
			:wikitext( mw.text.nowiki( pageName ) )
			:wikitext( '</b> »' )
			:done()
		:tag( 'tr' )
			:tag( 'th' )
				:attr{ scope = 'col' }
				:cssText( 'width:6em; font-weight:normal;' )
				:wikitext( switch( args.avancement.nom, titreAvancement ) )
				:done()
			:tag( 'th' )
				:attr{ scope = 'col' }
				:cssText( 'width:6em; font-weight:normal;' )
				:wikitext( '[[Projet:Évaluation/Importance|Importance]]' )
				:done()
			:tag( 'th' )
				:attr{ scope = 'col', colspan = 2 }
				:cssText( 'text-align:left; font-weight:normal;' )
				:wikitext( 'pour le [[Projet:Accueil|projet]]' )
		:allDone()
	local ligne = mw.html.create( 'tr' )
			:tag( 'td' )
				:attr( 'rowspan', #args )
				:cssText( 'text-align:center; font-weight:bold; background-color:' .. args.avancement.couleur )
				:cssText( args.avancement.extraCSS or nil )
				:wikitext( args.avancement.texte )
			:done()

	for numProjet, projet in ipairs( args ) do
		if projet.importance ~= args[numProjet-1].importance then
			local span = 1
			while numProjet + span <= #args
				and args[numProjet + span].importance == projet.importance
			do
				span = span + 1
			end
			ligne
				:tag( 'td' )
					:attr( 'rowspan', span )
					:cssText( 'text-align:center; font-weight:bold; background-color:' .. projet.importance.couleur )
					:cssText( projet.importance.extraCSS or nil )
					:wikitext( projet.importance.texte )
					:done()
		end

		local avancementCommun = args.avancement.nom

		local categories = ''
		if not args.nocat and page.namespace == 1 then
			categories = string.format( chaineCategorie,
				avancementCommun,
				projet.nomCategorie,
				avancementCommun,
				projet.nomCategorie,
				projet.importance.nom,
				projet.extraCategorie
			)
		end

		-- https://www.mediawiki.org/wiki/Extension:PageAssessments
		-- https://phabricator.wikimedia.org/T153393
		local assessment = frame:callParserFunction( '#assessment', { projet.nom, avancementCommun, projet.importance.nom } )

		ligne
			:tag( 'td' )
				:cssText( 'text-align:center; width:40px' )
				:wikitext( string.format( '[[Fichier:%s|40x20px|alt=]]', projet.image ) )
				:done()
			:tag( 'td' )
				:wikitext( ( string.gsub( liensProjet, '¤', projet.nom ) ) )
				:wikitext( categories )
				:wikitext( assessment )
				:done()

		evalTable:node( ligne )
		ligne = mw.html.create( 'tr' )
	end
	if #args == 0 then
		evalTable:node( ligne )
	end
	return tostring( evalTable )
end

function p.projet( frame )
	local args
	if type( frame.getParent ) == 'function' then
		args = analyseArgs( frame:getParent().args )
	else
		args = analyseArgs( frame.args )  -- pour tester dans la console
	end
	if args[1] then
		return p.introduction(args) .. p.tableauAvancement( args )
	else
		return p.tableauAvancement( args )
	end
end

return p