Module:Palette de navigation

De Ekopedia
Révision de 14 octobre 2021 à 01:36 par - Hermes - (discussion | contributions) (create)

(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

Ce module implémente le modèle {{Utilisateur:Hlm Z./Palette de navigation}}. Voir la page du modèle pour les instructions d'utilisation.

Fonctions exportables[modifier]

  • palette(frame) – Fonction principale du module appelable avec #invoke dans un modèle renvoyant la structure HTML de la palette.
  • _palette(args) – Fonction subsidiaire du module appelable avec require() dans un autre module renvoyant la structure HTML de la palette.

Autres fonctions[modifier]

  • erreur() – Retourne un message d'erreur en rouge visible par l'utilisateur.
  • formatageLigne(liste) – Prend en argument la liste des éléments de la palette et retourne le formatage wikifié de cette liste.
  • liens() – Retourne la mise en forme du lien modifier disponible en haut à gauche de la palette.
  • entete() – Construit l'entête des palettes et retourne le titre, l'état et le bouton modifier des palette.
  • banniere() – Construit les bannières inférieures et supérieures des palettes.
  • listeSimple(liste, n, pariteLigne) – Retourne les listes simples pairs ou impairs. L'argument pariteLigne permet de désactiver les listes pairs (option pour les sections).
  • listeGroupe(groupe, liste, n) – Retourne les groupes avec listes pairs ou impairs.
  • ligne(prefixe, n) – Retourne la ligne des palettes (liste, groupe et sous-groupe). Cette méthode permet également les sous-groupes récursifs.
  • section(n) – Retourne les sections déroulantes des palettes (liste, sous-groupe et sous-liste). Cette méthode permet les sous-groupes grâce à l'appel de la méthode lignePalette(prefixe, n).
  • contenu() – Construit le corps des palettes (ligne ou section).

Exemples[modifier]

Pour des exemples, voir la page de test permettant de tester diverses modifications apportées.

Modèle:Méta lien vers projet


--Ce module implémente le modèle {{Palette de navigation}}.

local p = {}

-- Redéfinition utile.
local format = mw.ustring.format

local lignes = 30 -- Nombre maximal de ligne.
local altern = 1 -- Variable d'alternance des lignes.
local styles = 'Module:Palette de navigation/styles.css'

local function erreur(texte, argManquant)
	local res = mw.html.create('span')
		:addClass('error')
		:wikitext('Erreur : ')

	if argManquant then
		res:wikitext(format('Paramètre <code>|%s=</code> introuvable', texte))
	else
		res:wikitext(texte)
	end

	return tostring(res)
end

local function formatageListe(liste)
	if liste:match('^\n') then
		return liste
	end
	return '\n' .. liste .. '\n'
end

local function liens(args)
	local titre = mw.title.new(args['modèle'], args.namespace or 'Modèle')
	local lien = function(abbr, texte, action)
		return mw.html.create('li')
			:wikitext('[' .. titre:fullUrl(action) .. ' ')
			:tag('abbr')
				:addClass('abbr')
				:attr('title', abbr)
				:cssText(args.couleur)
				:wikitext(texte)
				:done()
			:wikitext(']')
	end
	local res = mw.html.create('div')
		:addClass('palette-liens liste-horizontale')
		:addClass('noprint plainlinksneverexpand')
	res
		:tag('ul')
			:node(lien('Voir ce modèle', 'v'))
			:node(lien('Modifier ce modèle', 'm', 'action=edit'))

	return res
end

local function entete(args)
	local res = mw.html.create()
	local modele = args['modèle']

	-- Paramètre modèle.
	if modele and modele ~= 'inactif' then
		res:node(liens(args))
	elseif not modele then
		res:wikitext(erreur('modèle', true))
	end

	-- Titre de la palette.
	res
		:tag('div')
			:addClass('palette-titre')
			:cssText(args.couleur)
			:wikitext(args.titre or erreur('titre', true))

	return res
end

local function banniere(args, banniere)
	if banniere then
		local res = mw.html.create('div')
			:addClass('palette-banniere liste-horizontale')
			:cssText(args.couleur)
			:wikitext(formatageListe(banniere))

		return res
	end
end

local function image(args)
	if args.image then
		local res = mw.html.create('div')
			:addClass('palette-image')

		if args.image:match('^%[') or args.image:match('^%<') then
			res:wikitext(args.image)
		else
			local lienImage = '[[Fichier:%s|100px]]'
			res:wikitext(format(lienImage, args.image))
		end

		return res
	end
end

local function listeSimple(args, liste, n, pariteLigne)
	local res = mw.html.create('li')
		:addClass('palette-ligne-simple')
		:tag('div')
			:addClass('palette-liste-simple')
			-- Parité d'une liste simple (sans groupe).
			:addClass(altern % 2 == 0 and pariteLigne
				and 'palette-pair'
				or nil)
			:addClass('liste-horizontale')
			:cssText(args.styleliste)
			:wikitext(formatageListe(liste))
			:done()
	altern = altern + 1

	return tostring(res)
end

local function listeGroupe(args, groupe, liste, n)
	local res = mw.html.create('li')
		:addClass('palette-ligne')
		:tag('div')
			:addClass('palette-groupe')
			:cssText(args.couleur)
			:wikitext(groupe)
			:done()
		:tag('div')
			:addClass('palette-liste')
			-- Parité d'une liste avec groupe.
			:addClass(altern % 2 == 0
				and 'palette-pair'
				or nil)
			:addClass('liste-horizontale')
			:wikitext(formatageListe(liste))
			:done()
	altern = altern + 1

	return tostring(res)
end

local function ligne(args, n, prefixe)
	prefixe = prefixe or ''
	local liste = args['liste' .. prefixe .. n]
	local groupe = args['groupe' .. prefixe .. n]

	-- Liste seule.
	if liste and not groupe then
		return listeSimple(args, liste, n, true)

	-- Liste et groupe présent.
	elseif groupe and liste then
		return listeGroupe(args, groupe, liste, n)

	-- Groupe seul avec sous-ligne.
	elseif groupe then
		local sousLignes = ''
		for i = 1, lignes do
			local ligneCourante = ligne(args, i, prefixe .. n .. '.')
			if not ligneCourante then break end
			sousLignes = sousLignes .. ligneCourante
		end

		-- Détection des erreurs de paramètrage.
		if sousLignes == '' then
			return erreur('Gestion incorrecte des groupes/sous-groupes')
		end

		-- Construction des sous-lignes.
		local res = mw.html.create('li')
			:addClass('palette-ligne')
			:tag('div')
				:addClass('palette-groupe')
				:cssText(args.couleur)
				:wikitext(groupe)
				:done()
			:tag('div')
				:addClass('palette-listes')
				:tag('ul')
					:node(sousLignes)
			:allDone()

		return tostring(res)
	end
end

local function section(args, n)
	local section = args['section' .. n]
	local liste = args['liste' .. n]

	-- Liste seule.
	if liste and not section then
		return listeSimple(args, liste, n, true)

	-- Section avec liste simple ou sous-ligne.
	elseif liste or section then
		local res = mw.html.create('li')
			:addClass('palette mw-collapsible mw-collapsed')
			:css('border', '0')
			:css('border-top', '2px solid white')
			:css('font-size', '100%')
		local contenuSection = res:tag('div')
			:addClass('palette-section')
			:cssText(args.couleur)
			:wikitext(section)
			:done()
			:tag('div')
				:addClass('mw-collapsible-content')
				:tag('ul')

		-- Section avec liste simple.
		if liste and section then
			contenuSection:node(listeSimple(args, liste, n, false))
			return tostring(res)
		end

		-- Section avec sous-ligne.
		local sousLignes = ''
		for i = 1, lignes do
			local ligneCourante = ligne(args, i, n .. '.')
			if not ligneCourante then break end
			sousLignes = sousLignes .. ligneCourante
		end

		-- Détection des erreurs de paramètrage.
		if sousLignes == '' then
			return erreur('Gestion incorrecte des sections')
		end		contenuSection:wikitext(sousLignes)

		return tostring(res)
	end
end

local function contenu(args)
	local res = mw.html.create('ul')
	local contenu = ''

	if args.image then
		res:addClass('palette-image')
	end

	-- Détection d'une section. On suppose ici que la liste des arguments est
	-- ordonnée et ne comporte aucun saut.
	if args['section1']
	and (args['liste1'] or args['liste1.1'] or args['groupe1.1']) then
		for i = 1, lignes do
			local sectionCourante = section(args, i)
			if not sectionCourante then break end
			res:node(sectionCourante)
			altern = 1
		end
	-- Détection d'une ligne.
	else
		for i = 1, lignes do
			local ligneCourante = ligne(args, i)
			if not ligneCourante then break end
			res:node(ligneCourante)
		end
	end

	return res
end

function p._palette(args)
	local loadStyles = mw.getCurrentFrame():extensionTag('templatestyles', '', {
		src = styles
	})
	local res = mw.html.create('div')
		:addClass('palette mw-collapsible')
		:wikitext(loadStyles)
	local etat = args['état']

	-- Paramètre état.
	if etat == 'fermé' then
		res:addClass('mw-collapsed')
	elseif etat == 'ouvert' then
		res:addClass('mw-uncollapsed')
	end

	res
		:node(entete(args))
		:tag('div')
			:addClass('mw-collapsible-content')
			:node(banniere(args, args.dessus))
			:node(args.contenu or contenu(args))
			:node(image(args))
			:node(banniere(args, args.dessous))

	return res
end

function p.palette(frame)
	local args = {}
	local argsParent = frame:getParent().args

	-- Paramètres vides interprétés par Lua.
	for cle, val in pairs(argsParent) do
		if val ~= '' then
			args[cle] = val
		end
	end

	return p._palette(args)
end

return p