Module:Palette de navigation/Bac à sable

Уикипедия — ашық энциклопедиясынан алынған мәлімет
Навигацияға өту Іздеуге өту

Бұл модульдің құжаттамасын Module:Palette de navigation/Bac à sable/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.

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

function p._palette(argsPalette)
	args = argsPalette
	local etat = args['état']
	local res = mw.html.create('div')
		:addClass('palette fr-collapsible')

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

	res
		-- Construction de l'entête de la palette.
		:node(entetePalette())
		:tag('div')
			:addClass('fr-collapsible-content')
			 -- Construction de la bannière supérieure de la palette.
			:node(dessusPalette())
			-- Construction du contenu de la palette.	
			:node(args.contenu or contenuPalette())
			-- Construction de la bannière inférieure de la palette.
			:node(dessousPalette())

	return tostring(res)
end

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

function formatageListe(liste)
	local premier = mw.ustring.sub(liste, 1, 1)
	local dernier = mw.ustring.sub(liste, -1, -1)
	local frame = mw.getCurrentFrame()
 
	-- Formatage de début de liste.
	if premier ~= '\n' then
		liste = '\n' .. liste
	end

	--Formatage de fin de liste
	if dernier ~= '\n' then
		return frame:preprocess(liste .. '\n')
	else
		return frame:preprocess(liste)
	end
end

function lienModifier()
	local res = mw.html.create('span')
	local titre = (args.namespace or 'Modèle') .. ':' .. args['modèle']

	res
		:addClass('palette-modifier noprint plainlinksneverexpand')
		:wikitext('[[')
		:wikitext(titre)
		:wikitext('|')
		:tag('abbr')
			:addClass('abbr')
			:attr('title', 'Voir ce modèle')
			:cssText(args.couleur)
			:wikitext('modifier')
			:done()
		:wikitext(']]')

	return tostring(res)
end

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

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

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

	return tostring(res)
end

function dessusPalette()
	local res = mw.html.create()

	-- Bannière supérieure.
	if args.dessus then
		res
			:tag('div')
				:addClass('palette-banniere liste-horizontale')
				:cssText(args.couleur)
				:wikitext(formatageListe(args.dessus))
	end

	return tostring(res)
end

function dessousPalette()
	local res = mw.html.create()

	-- Comportement différent si argument image.
	if args.image then
		detectionImage = res:tag('div')
			:addClass('palette-image')

		if mw.ustring.sub(args.image, 1, 1) == '[' then
			detectionImage:wikitext(args.image)
		else
			local lienImage = '[[Fichier:%s|100px]]'
			detectionImage:wikitext(format(lienImage, args.image))
		end
	end
	-- Bannière inférieure.
	if args.dessous then
		res
			:tag('div')
				:addClass('palette-banniere liste-horizontale')
				:cssText(args.couleur)
				:wikitext(formatageListe(args.dessous))
	end

	return tostring(res)
end

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

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

	-- Détection d'une section.
	if args['section1'] and (args['liste1'] or args['liste1.1'] or args['groupe1.1']) then
		for i = 1, lignes do
			local sectionCourante = sectionPalette('', i)
			if sectionCourante == '' then break end
			res:node(sectionCourante)
		end
	-- Détection d'une ligne.
	else
		for i = 1, lignes do
			local ligneCourante = lignePalette('', i)
			if ligneCourante == '' then break end
			res:node(ligneCourante)
		end
	end

	return tostring(res)
end

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

	-- Liste et section absent.
	if not liste and not section then
		return ''
	-- Liste seule.
	elseif liste and not section then
		return listeSimple(liste, n, true)
	end

	-- Sinon : Section avec liste simple ou sous-ligne.
	local res = mw.html.create('li')
		:addClass('palette fr-collapsible fr-collapsed')
		:css('border', '0')
		:css('padding', '2px 0 0')
		:css('font-size', '100%')

	local contenuSection = res:tag('p')
		:addClass('palette-section')
		:cssText(args.couleur)
		:wikitext(section)
		:tag('div')
			:addClass('fr-collapsible-content')
			:tag('ul')

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

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

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

	contenuSection:node(sousLignes)

	return tostring(res)
end

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

	-- Liste et groupe absent.
	if not liste and not groupe then
		return ''
	-- Liste seule.
	elseif liste and not groupe then
		return listeSimple(liste, n, true)
	-- Liste et groupe présent.
	elseif groupe and liste then
		return listeGroupe(groupe, liste, n)
	end

	-- Sinon : Groupe seul avec sous-ligne.
	local sousLignes = ''
	for i = 1, lignes do
		local ligneCourante = lignePalette(prefixe .. n .. '.', i)
		if ligneCourante == '' then break end
		sousLignes = sousLignes .. ligneCourante
	end

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

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

	return tostring(res)
end

function listeSimple(liste, n, pariteLigne)
	local res = mw.html.create('li')
		:addClass('palette-ligne-simple')

	local listeSimpleParite = res:tag('div')
	-- Parité d'une liste simple (sans groupe).
	if altern % 2 == 0 and pariteLigne then
		listeSimpleParite:addClass('palette-liste-simple-pair liste-horizontale')
	else
		listeSimpleParite:addClass('palette-liste-simple liste-horizontale')
	end

	listeSimpleParite:wikitext(formatageListe(liste))
	altern = altern + 1

	return tostring(res)
end

function listeGroupe(groupe, liste, n)
	local res = mw.html.create('li')
		:addClass('palette-ligne')
		:tag('span')
			:addClass('palette-groupe')
			:cssText(args.couleur)
			:wikitext(groupe)
			:done()

	local listeGroupeParite = res:tag('div')
	-- Parité d'une liste avec groupe.
	if altern % 2 == 0 then
		listeGroupeParite:addClass('palette-liste-pair liste-horizontale')
	else
		listeGroupeParite:addClass('palette-liste liste-horizontale')
	end

	listeGroupeParite:wikitext(formatageListe(liste))
	altern = altern + 1

	return tostring(res)
end

return p