Module:Palèt navigasyon

La documentation pour ce module peut être créée à Module:Palèt navigasyon/doc

--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:Palèt navigasyon/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èl'], args.namespace or 'Modèl')
	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('palet-liens liste-horizontale')
		:addClass('noprint plainlinksneverexpand')
	res
		:tag('ul')
			:node(lien('Gade modèl sa a', 'v'))
			:node(lien('Modifye modèl sa a', 'm', 'action=edit'))

	return res
end

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

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

	-- Titre de la palette.
	res
		:tag('div')
			:addClass('palèt-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 = '[[Fichye:%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 'palèt-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('palèt-ligne')
		:tag('div')
			:addClass('palèt-groupe')
			:cssText(args.couleur)
			:wikitext(groupe)
			:done()
		:tag('div')
			:addClass('palèt-liste')
			-- Parité d'une liste avec groupe.
			:addClass(altern % 2 == 0
				and 'palèt-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('palèt-ligne')
			:tag('div')
				:addClass('palèt-groupe')
				:cssText(args.couleur)
				:wikitext(groupe)
				:done()
			:tag('div')
				:addClass('palèt-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('pallèt mw-collapsible mw-collapsed')
			:css('border', '0')
			:css('border-top', '2px solid white')
			:css('font-size', '100%')
		local contenuSection = res:tag('div')
			:addClass('palèt-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._palet(args)
	local loadStyles = mw.getCurrentFrame():extensionTag('templatestyles', '', {
		src = styles
	})
	local res = mw.html.create('div')
		:addClass('palèt 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.palet(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._palet(args)
end

return p